From c6b7a8c0a401dc9a3f5b0511ebfb8727fc19b53a Mon Sep 17 00:00:00 2001 From: Aaryamann Challani <43716372+rymnc@users.noreply.github.com> Date: Mon, 24 Jul 2023 10:14:49 +0200 Subject: [PATCH] Revert "remove multiplier (#184)" (#185) This reverts commit 4ec93c5e1f663c111ab29d477ef74a1589ffbe01. --- .github/workflows/ci.yml | 6 +- Cargo.lock | 15 +++- Cargo.toml | 1 + multiplier/Cargo.toml | 32 +++++++ multiplier/Makefile.toml | 7 ++ multiplier/README.md | 21 +++++ multiplier/resources/circom2_multiplier2.r1cs | Bin 0 -> 264 bytes multiplier/resources/circom2_multiplier2.wasm | Bin 0 -> 29071 bytes multiplier/src/ffi.rs | 77 +++++++++++++++++ multiplier/src/lib.rs | 2 + multiplier/src/main.rs | 49 +++++++++++ multiplier/src/public.rs | 79 ++++++++++++++++++ multiplier/tests/public.rs | 21 +++++ 13 files changed, 306 insertions(+), 4 deletions(-) create mode 100644 multiplier/Cargo.toml create mode 100644 multiplier/Makefile.toml create mode 100644 multiplier/README.md create mode 100644 multiplier/resources/circom2_multiplier2.r1cs create mode 100644 multiplier/resources/circom2_multiplier2.wasm create mode 100644 multiplier/src/ffi.rs create mode 100644 multiplier/src/lib.rs create mode 100644 multiplier/src/main.rs create mode 100644 multiplier/src/public.rs create mode 100644 multiplier/tests/public.rs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 08eecc3..67941e8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,6 +5,7 @@ on: paths-ignore: - '**.md' - '!.github/workflows/*.yml' + - '!multiplier/src/**' - '!private-settlement/src/**' - '!rln-wasm/**' - '!rln/src/**' @@ -15,6 +16,7 @@ on: paths-ignore: - '**.md' - '!.github/workflows/*.yml' + - '!multiplier/src/**' - '!private-settlement/src/**' - '!rln-wasm/**' - '!rln/src/**' @@ -30,7 +32,7 @@ jobs: strategy: matrix: platform: [ubuntu-latest, macos-latest] - crate: [semaphore, rln, utils] + crate: [multiplier, semaphore, rln, utils] runs-on: ${{ matrix.platform }} timeout-minutes: 60 @@ -83,7 +85,7 @@ jobs: matrix: # we run lint tests only on ubuntu platform: [ubuntu-latest] - crate: [semaphore, rln, utils] + crate: [multiplier, semaphore, rln, utils] runs-on: ${{ matrix.platform }} timeout-minutes: 60 diff --git a/Cargo.lock b/Cargo.lock index 80562f0..706cf84 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1532,8 +1532,7 @@ dependencies = [ [[package]] name = "ethers-core" version = "2.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60ca2514feb98918a0a31de7e1983c29f2267ebf61b2dc5d4294f91e5b866623" +source = "git+https://github.com/gakonst/ethers-rs?rev=030bf43#030bf439a100dcacd2e968e3114de0612229056b" dependencies = [ "arrayvec", "bytes", @@ -2078,6 +2077,18 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389" +[[package]] +name = "multiplier" +version = "0.1.0" +dependencies = [ + "ark-bn254 0.3.0", + "ark-circom 0.1.0 (git+https://github.com/gakonst/ark-circom?rev=35ce5a9)", + "ark-groth16 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "color-eyre 0.6.2", +] + [[package]] name = "num" version = "0.4.0" diff --git a/Cargo.toml b/Cargo.toml index 58eb7d7..fbba3a9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,6 @@ [workspace] members = [ + "multiplier", "private-settlement", "semaphore", "rln", diff --git a/multiplier/Cargo.toml b/multiplier/Cargo.toml new file mode 100644 index 0000000..89ff9e2 --- /dev/null +++ b/multiplier/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "multiplier" +version = "0.1.0" +edition = "2018" +license = "MIT OR Apache-2.0" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] + +# WASM operations +# wasmer = { version = "2.0" } +# fnv = { version = "1.0.3", default-features = false } +# num = { version = "0.4.0" } +# num-traits = { version = "0.2.0", default-features = false } + +# ZKP Generation +# ark-ff = { version = "0.3.0", default-features = false, features = ["parallel", "asm"] } +ark-std = { version = "0.3.0", default-features = false, features = ["parallel"] } +ark-bn254 = { version = "0.3.0" } +ark-groth16 = { git = "https://github.com/arkworks-rs/groth16", rev = "765817f", features = ["parallel"] } +# ark-poly = { version = "^0.3.0", default-features = false, features = ["parallel"] } +ark-serialize = { version = "0.3.0", default-features = false } + +ark-circom = { git = "https://github.com/gakonst/ark-circom", features = ["circom-2"], rev = "35ce5a9" } + +# error handling +color-eyre = "0.6.1" + +# decoding of data +# hex = "0.4.3" +# byteorder = "1.4.3" diff --git a/multiplier/Makefile.toml b/multiplier/Makefile.toml new file mode 100644 index 0000000..b4cce21 --- /dev/null +++ b/multiplier/Makefile.toml @@ -0,0 +1,7 @@ +[tasks.build] +command = "cargo" +args = ["build", "--release"] + +[tasks.test] +command = "cargo" +args = ["test", "--release"] diff --git a/multiplier/README.md b/multiplier/README.md new file mode 100644 index 0000000..a2eff0d --- /dev/null +++ b/multiplier/README.md @@ -0,0 +1,21 @@ +# Multiplier example + +Example wrapper around a basic Circom circuit to test Circom 2 integration +through ark-circom and FFI. + +## Build and Test + +To build and test, run the following commands within the module folder +```bash +cargo make build +cargo make test +``` + +## FFI + +To generate C or Nim bindings from Rust FFI, use `cbindgen` or `nbindgen`: + +``` +cbindgen . -o target/multiplier.h +nbindgen . -o target/multiplier.nim +``` diff --git a/multiplier/resources/circom2_multiplier2.r1cs b/multiplier/resources/circom2_multiplier2.r1cs new file mode 100644 index 0000000000000000000000000000000000000000..e61b9b091d3e08fab09d4639f9763e776451f221 GIT binary patch literal 264 zcmXRiOfF_*U|?VdVkRK20AdgTiGlb)@L}@Tht3lVc2;`4FxH5TXl&f(8n8oif#Jg< zzZ3(QUJ#8BfaIZS2%6^rHAn%X2d{b-h#IgCkb6OV5P-Q$0n9@XFn2=z2KF~d7696s BEn)xw literal 0 HcmV?d00001 diff --git a/multiplier/resources/circom2_multiplier2.wasm b/multiplier/resources/circom2_multiplier2.wasm new file mode 100644 index 0000000000000000000000000000000000000000..7ea487c35dda61de0272a262f576c463808a5ab4 GIT binary patch literal 29071 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 literal 0 HcmV?d00001 diff --git a/multiplier/src/ffi.rs b/multiplier/src/ffi.rs new file mode 100644 index 0000000..b865a90 --- /dev/null +++ b/multiplier/src/ffi.rs @@ -0,0 +1,77 @@ +use crate::public::Multiplier; +use std::slice; + +/// Buffer struct is taken from +/// https://github.com/celo-org/celo-threshold-bls-rs/blob/master/crates/threshold-bls-ffi/src/ffi.rs +/// +/// Also heavily inspired by https://github.com/kilic/rln/blob/master/src/ffi.rs + +#[repr(C)] +#[derive(Clone, Debug, PartialEq)] +pub struct Buffer { + pub ptr: *const u8, + pub len: usize, +} + +impl From<&[u8]> for Buffer { + fn from(src: &[u8]) -> Self { + Self { + ptr: &src[0] as *const u8, + len: src.len(), + } + } +} + +impl<'a> From<&Buffer> for &'a [u8] { + fn from(src: &Buffer) -> &'a [u8] { + unsafe { slice::from_raw_parts(src.ptr, src.len) } + } +} + +#[allow(clippy::not_unsafe_ptr_arg_deref)] +#[no_mangle] +pub extern "C" fn new_circuit(ctx: *mut *mut Multiplier) -> bool { + if let Ok(mul) = Multiplier::new() { + unsafe { *ctx = Box::into_raw(Box::new(mul)) }; + true + } else { + false + } +} + +#[allow(clippy::not_unsafe_ptr_arg_deref)] +#[no_mangle] +pub extern "C" fn prove(ctx: *const Multiplier, output_buffer: *mut Buffer) -> bool { + println!("multiplier ffi: prove"); + let mul = unsafe { &*ctx }; + let mut output_data: Vec = Vec::new(); + + match mul.prove(&mut output_data) { + Ok(proof_data) => proof_data, + Err(_) => return false, + }; + unsafe { *output_buffer = Buffer::from(&output_data[..]) }; + std::mem::forget(output_data); + true +} + +#[allow(clippy::not_unsafe_ptr_arg_deref)] +#[no_mangle] +pub extern "C" fn verify( + ctx: *const Multiplier, + proof_buffer: *const Buffer, + result_ptr: *mut u32, +) -> bool { + println!("multiplier ffi: verify"); + let mul = unsafe { &*ctx }; + let proof_data = <&[u8]>::from(unsafe { &*proof_buffer }); + if match mul.verify(proof_data) { + Ok(verified) => verified, + Err(_) => return false, + } { + unsafe { *result_ptr = 0 }; + } else { + unsafe { *result_ptr = 1 }; + }; + true +} diff --git a/multiplier/src/lib.rs b/multiplier/src/lib.rs new file mode 100644 index 0000000..767579a --- /dev/null +++ b/multiplier/src/lib.rs @@ -0,0 +1,2 @@ +pub mod ffi; +pub mod public; diff --git a/multiplier/src/main.rs b/multiplier/src/main.rs new file mode 100644 index 0000000..30c1657 --- /dev/null +++ b/multiplier/src/main.rs @@ -0,0 +1,49 @@ +use ark_circom::{CircomBuilder, CircomConfig}; +use ark_std::rand::thread_rng; +use color_eyre::{Report, Result}; + +use ark_bn254::Bn254; +use ark_groth16::{ + create_random_proof as prove, generate_random_parameters, prepare_verifying_key, verify_proof, +}; + +fn groth16_proof_example() -> Result<()> { + let cfg = CircomConfig::::new( + "./resources/circom2_multiplier2.wasm", + "./resources/circom2_multiplier2.r1cs", + )?; + + let mut builder = CircomBuilder::new(cfg); + builder.push_input("a", 3); + builder.push_input("b", 11); + + // create an empty instance for setting it up + let circom = builder.setup(); + + let mut rng = thread_rng(); + let params = generate_random_parameters::(circom, &mut rng)?; + + let circom = builder.build()?; + + let inputs = circom + .get_public_inputs() + .ok_or(Report::msg("no public inputs"))?; + + let proof = prove(circom, ¶ms, &mut rng)?; + + let pvk = prepare_verifying_key(¶ms.vk); + + match verify_proof(&pvk, &proof, &inputs) { + Ok(_) => Ok(()), + Err(_) => Err(Report::msg("not verified")), + } +} + +fn main() { + println!("Hello, world!"); + + match groth16_proof_example() { + Ok(_) => println!("Success"), + Err(_) => println!("Error"), + } +} diff --git a/multiplier/src/public.rs b/multiplier/src/public.rs new file mode 100644 index 0000000..4312e7a --- /dev/null +++ b/multiplier/src/public.rs @@ -0,0 +1,79 @@ +use ark_circom::{CircomBuilder, CircomCircuit, CircomConfig}; +use ark_std::rand::thread_rng; + +use ark_bn254::Bn254; +use ark_groth16::{ + create_random_proof as prove, generate_random_parameters, prepare_verifying_key, verify_proof, + Proof, ProvingKey, +}; +use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; +use color_eyre::{Report, Result}; +use std::io::{Read, Write}; + +pub struct Multiplier { + circom: CircomCircuit, + params: ProvingKey, +} + +impl Multiplier { + // TODO Break this apart here + pub fn new() -> Result { + let cfg = CircomConfig::::new( + "./resources/circom2_multiplier2.wasm", + "./resources/circom2_multiplier2.r1cs", + )?; + + let mut builder = CircomBuilder::new(cfg); + builder.push_input("a", 3); + builder.push_input("b", 11); + + // create an empty instance for setting it up + let circom = builder.setup(); + + let mut rng = thread_rng(); + + let params = generate_random_parameters::(circom, &mut rng)?; + + let circom = builder.build()?; + + Ok(Multiplier { circom, params }) + } + + // TODO Input Read + pub fn prove(&self, result_data: W) -> Result<()> { + let mut rng = thread_rng(); + + // XXX: There's probably a better way to do this + let circom = self.circom.clone(); + let params = self.params.clone(); + + let proof = prove(circom, ¶ms, &mut rng)?; + + // XXX: Unclear if this is different from other serialization(s) + proof.serialize(result_data)?; + + Ok(()) + } + + pub fn verify(&self, input_data: R) -> Result { + let proof = Proof::deserialize(input_data)?; + + let pvk = prepare_verifying_key(&self.params.vk); + + // XXX Part of input data? + let inputs = self + .circom + .get_public_inputs() + .ok_or(Report::msg("no public inputs"))?; + + let verified = verify_proof(&pvk, &proof, &inputs)?; + + Ok(verified) + } +} + +impl Default for Multiplier { + fn default() -> Self { + Self::new().unwrap() + } +} diff --git a/multiplier/tests/public.rs b/multiplier/tests/public.rs new file mode 100644 index 0000000..f955e71 --- /dev/null +++ b/multiplier/tests/public.rs @@ -0,0 +1,21 @@ +#[cfg(test)] +mod tests { + use multiplier::public::Multiplier; + + #[test] + fn multiplier_proof() { + let mul = Multiplier::new().unwrap(); + + let mut output_data: Vec = Vec::new(); + let _ = mul.prove(&mut output_data); + + let proof_data = &output_data[..]; + + // XXX Pass as arg? + //let pvk = prepare_verifying_key(&mul.params.vk); + + let verified = mul.verify(proof_data).unwrap(); + + assert!(verified); + } +}