r14-circuit 0.1.0

Transfer circuit (Groth16/BLS12-381) for Root14
Documentation
use ark_bls12_381::Fr;
use ark_crypto_primitives::sponge::{
    constraints::CryptographicSpongeVar,
    poseidon::constraints::PoseidonSpongeVar,
};
use ark_r1cs_std::fields::fp::FpVar;
use ark_relations::r1cs::ConstraintSystemRef;
use r14_poseidon::poseidon_config;

pub fn poseidon_hash_var(
    cs: ConstraintSystemRef<Fr>,
    inputs: &[FpVar<Fr>],
) -> Result<FpVar<Fr>, ark_relations::r1cs::SynthesisError> {
    let config = poseidon_config();
    let mut sponge = PoseidonSpongeVar::new(cs, &config);
    sponge.absorb(&inputs)?;
    let out = sponge.squeeze_field_elements(1)?;
    Ok(out.into_iter().next().unwrap())
}

pub fn hash2_var(
    cs: ConstraintSystemRef<Fr>,
    a: &FpVar<Fr>,
    b: &FpVar<Fr>,
) -> Result<FpVar<Fr>, ark_relations::r1cs::SynthesisError> {
    poseidon_hash_var(cs, &[a.clone(), b.clone()])
}