arnaucube
arnaucube/grapevine-sonobePublic Self-hosted repository
add circuit isolated test without using Sonobe
arnaucube root@arnaucube.com
Tue, 30 Apr 2024 15:05:03 +0200
commit

c4d9962e82a23df36bf594ec4417695d4eb59e45

parent

69812e791c4de4bf3b9273a6934e54a26f66bad1

2 files changed, 62 insertions(+), 5 deletions(-)

jump to
M Cargo.toml → Cargo.toml

@@ -27,6 +27,7 @@ serde_json = "1.0.116"

[dev-dependencies] lazy_static = "1.4.0" +ark-circom = { git = "https://github.com/arnaucube/circom-compat.git" } [patch.crates-io] # patch ark_curves to use a cherry-picked version which contains
M src/circom.rs → src/circom.rs

@@ -7,12 +7,12 @@ get_z0, prepare_external_inputs, random_f_bigint, CircomPrivateInput,

}; use ark_bn254::{constraints::GVar, Fr, G1Projective as Projective}; // use ark_circom::circom::CircomCircuit; - use ark_ff::PrimeField; + use ark_ff::{BigInteger, PrimeField}; use ark_grumpkin::{constraints::GVar as GVar2, Projective as Projective2}; use ark_r1cs_std::{alloc::AllocVar, fields::fp::FpVar, R1CSVar}; use ark_relations::r1cs::{ConstraintSynthesizer, ConstraintSystem}; use lazy_static::lazy_static; - use num_bigint::BigInt; + use num_bigint::{BigInt, Sign}; use sonobe::{ commitment::pedersen::Pedersen, folding::nova::Nova, frontend::circom::CircomFCircuit, transcript::poseidon::poseidon_test_config, Error, FoldingScheme,

@@ -42,6 +42,61 @@ .try_into()

.unwrap(); } + // Converts a PrimeField element to a num_bigint::BigInt representation. + pub fn ark_primefield_to_num_bigint<F: PrimeField>(value: F) -> BigInt { + let primefield_bigint: F::BigInt = value.into_bigint(); + let bytes = primefield_bigint.to_bytes_be(); + BigInt::from_bytes_be(Sign::Plus, &bytes) + } + + /// This test tests the circom circuit without using anything from Sonobe, just using + /// arkworks/circom-compat to check the Grapevine circuit. + #[test] + fn test_circom_circuit() { + // define inputs + let step_0_inputs = CircomPrivateInput { + phrase: Some(String::from(&*PHRASE)), + usernames: [None, Some(String::from(&*USERNAMES[0]))], + auth_secrets: [None, Some(AUTH_SECRETS[0].clone())], + chaff: false, + }; + let external_inputs = prepare_external_inputs::<Fr>(&step_0_inputs); + let z_0 = get_z0::<Fr>(); + dbg!(&z_0); + + let z_0_bi = z_0 + .iter() + .map(|val| ark_primefield_to_num_bigint(*val)) + .collect::<Vec<BigInt>>(); + let external_inputs_bi = external_inputs + .iter() + .map(|val| ark_primefield_to_num_bigint(*val)) + .collect::<Vec<BigInt>>(); + + use ark_circom::{CircomBuilder, CircomConfig}; + let cfg = CircomConfig::<Fr>::new( + "./circom/artifacts/grapevine.wasm", + "./circom/artifacts/grapevine.r1cs", + ) + .unwrap(); + + let mut builder = CircomBuilder::new(cfg); + + // Insert our public inputs as key value pairs + use std::collections::HashMap; + builder.inputs = HashMap::from([ + ("ivc_input".to_string(), z_0_bi), + ("external_ipnuts".to_string(), external_inputs_bi), + ]); + dbg!(&builder.inputs); + + let circom = builder.build().unwrap(); + + // extract the public output (ivc_output) from the computed witness and print it + let z_1 = circom.witness.unwrap()[1..1 + 6 + 4].to_vec(); + println!("z_1: {:?}", z_1); + } + #[test] fn test_step_native() { // define inputs

@@ -54,7 +109,8 @@ };

let external_inputs = prepare_external_inputs::<Fr>(&step_0_inputs); // initialize new Grapevine function circuit - let f_circuit = CircomFCircuit::<Fr>::new((R1CS_PATH.clone(), WASM_PATH.clone(), 4, 6 + 4)); // 4=ivc_input.lenght, 6+4=external_inputs + let f_circuit = + CircomFCircuit::<Fr>::new((R1CS_PATH.clone(), WASM_PATH.clone(), 4, 6 + 4)).unwrap(); // 4=ivc_input.lenght, 6+4=external_inputs let z_0 = get_z0(); let z_1 = f_circuit

@@ -75,7 +131,8 @@ };

let external_inputs = prepare_external_inputs::<Fr>(&step_0_inputs); // initialize new Grapevine function circuit - let f_circuit = CircomFCircuit::<Fr>::new((R1CS_PATH.clone(), WASM_PATH.clone(), 4, 6 + 4)); // 4=ivc_input.lenght, 6+4=external_inputs + let f_circuit = + CircomFCircuit::<Fr>::new((R1CS_PATH.clone(), WASM_PATH.clone(), 4, 6 + 4)).unwrap(); // 4=ivc_input.lenght, 6+4=external_inputs let z_0 = get_z0(); let z_1 = f_circuit

@@ -89,7 +146,6 @@ let external_inputs_var =

Vec::<FpVar<Fr>>::new_witness(cs.clone(), || Ok(external_inputs)).unwrap(); // compute constraints for step 0 - let cs = ConstraintSystem::<Fr>::new_ref(); let z_1_var = f_circuit .generate_step_constraints(cs.clone(), 1, z_0_var, external_inputs_var) .unwrap();