Add ToConstraintField impls for some primitives

This commit is contained in:
Pratyush Mishra
2019-10-11 16:38:00 -07:00
parent 1b6f681cdb
commit cb2ff3b412
7 changed files with 40 additions and 11 deletions

View File

@@ -16,13 +16,15 @@ use r1cs_std::{groups::GroupGadget, uint8::UInt8};
use std::marker::PhantomData; use std::marker::PhantomData;
pub struct PedersenCommitmentCompressorGadget< pub struct PedersenCommitmentCompressorGadget<G, I, ConstraintF, GG, IG>
where
G: Group, G: Group,
I: InjectiveMap<G>, I: InjectiveMap<G>,
ConstraintF: Field, ConstraintF: Field,
GG: GroupGadget<G, ConstraintF>, GG: GroupGadget<G, ConstraintF>,
IG: InjectiveMapGadget<G, I, ConstraintF, GG>, IG: InjectiveMapGadget<G, I, ConstraintF, GG>,
> {
{
_compressor: PhantomData<I>, _compressor: PhantomData<I>,
_compressor_gadget: PhantomData<IG>, _compressor_gadget: PhantomData<IG>,
_crh: PedersenCommitmentGadget<G, ConstraintF, GG>, _crh: PedersenCommitmentGadget<G, ConstraintF, GG>,

View File

@@ -1,10 +1,12 @@
use crate::Error; use crate::Error;
use algebra::UniformRand; use algebra::UniformRand;
use algebra::{Field, ToConstraintField};
use algebra::{bytes::ToBytes, groups::Group, BitIterator, FpParameters, PrimeField};
use rand::Rng; use rand::Rng;
use std::marker::PhantomData; use std::marker::PhantomData;
use super::CommitmentScheme; use super::CommitmentScheme;
use algebra::{bytes::ToBytes, groups::Group, BitIterator, FpParameters, PrimeField};
use std::io::{Result as IoResult, Write}; use std::io::{Result as IoResult, Write};
pub use crate::crh::pedersen::PedersenWindow; pub use crate::crh::pedersen::PedersenWindow;
@@ -121,3 +123,11 @@ impl<G: Group, W: PedersenWindow> CommitmentScheme for PedersenCommitment<G, W>
Ok(result) Ok(result)
} }
} }
impl<ConstraintF: Field, G: Group + ToConstraintField<ConstraintF>> ToConstraintField<ConstraintF> for PedersenParameters<G> {
#[inline]
fn to_field_elements(&self) -> Result<Vec<ConstraintF>, Error> {
Ok(Vec::new())
}
}

View File

@@ -24,8 +24,7 @@ use r1cs_std::{
prelude::*, prelude::*,
}; };
pub trait InjectiveMapGadget<G: Group, I: InjectiveMap<G>, ConstraintF: Field, GG: GroupGadget<G, ConstraintF>> pub trait InjectiveMapGadget<G: Group, I: InjectiveMap<G>, ConstraintF: Field, GG: GroupGadget<G, ConstraintF>> {
{
type OutputGadget: EqGadget<ConstraintF> type OutputGadget: EqGadget<ConstraintF>
+ ToBytesGadget<ConstraintF> + ToBytesGadget<ConstraintF>
+ CondSelectGadget<ConstraintF> + CondSelectGadget<ConstraintF>
@@ -75,13 +74,14 @@ where
} }
} }
pub struct PedersenCRHCompressorGadget< pub struct PedersenCRHCompressorGadget<G, I, ConstraintF, GG, IG>
where
G: Group, G: Group,
I: InjectiveMap<G>, I: InjectiveMap<G>,
ConstraintF: Field, ConstraintF: Field,
GG: GroupGadget<G, ConstraintF>, GG: GroupGadget<G, ConstraintF>,
IG: InjectiveMapGadget<G, I, ConstraintF, GG>, IG: InjectiveMapGadget<G, I, ConstraintF, GG>,
> { {
_compressor: PhantomData<I>, _compressor: PhantomData<I>,
_compressor_gadget: PhantomData<IG>, _compressor_gadget: PhantomData<IG>,
_crh: PedersenCRHGadget<G, ConstraintF, GG>, _crh: PedersenCRHGadget<G, ConstraintF, GG>,

View File

@@ -1,10 +1,9 @@
use algebra::Field;
use crate::crh::{ use crate::crh::{
FixedLengthCRHGadget, FixedLengthCRHGadget,
pedersen::{PedersenCRH, PedersenParameters, PedersenWindow}, pedersen::{PedersenCRH, PedersenParameters, PedersenWindow},
}; };
use algebra::groups::Group; use algebra::{Field, Group};
use r1cs_core::{ConstraintSystem, SynthesisError}; use r1cs_core::{ConstraintSystem, SynthesisError};
use r1cs_std::prelude::*; use r1cs_std::prelude::*;

View File

@@ -7,6 +7,7 @@ use std::{
}; };
use crate::crh::FixedLengthCRH; use crate::crh::FixedLengthCRH;
use algebra::{Field, ToConstraintField};
use algebra::groups::Group; use algebra::groups::Group;
@@ -139,3 +140,11 @@ impl<G: Group> Debug for PedersenParameters<G> {
write!(f, "}}\n") write!(f, "}}\n")
} }
} }
impl<ConstraintF: Field, G: Group + ToConstraintField<ConstraintF>> ToConstraintField<ConstraintF> for PedersenParameters<G> {
#[inline]
fn to_field_elements(&self) -> Result<Vec<ConstraintF>, Error> {
Ok(Vec::new())
}
}

View File

@@ -28,13 +28,12 @@ where
_f: PhantomData<ConstraintF>, _f: PhantomData<ConstraintF>,
} }
impl<P, CRHGadget, ConstraintF> MerklePathVerifierGadget<P, CRHGadget, ConstraintF> impl<P, CRHGadget, ConstraintF> MerklePathVerifierGadget<P, CRHGadget, ConstraintF>
where where
P: MHTParameters, P: MHTParameters,
ConstraintF: Field, ConstraintF: Field,
CRHGadget: FixedLengthCRHGadget<P::H, ConstraintF>, CRHGadget: FixedLengthCRHGadget<P::H, ConstraintF>,
{ {
pub fn check_membership<CS: ConstraintSystem<ConstraintF>>( pub fn check_membership<CS: ConstraintSystem<ConstraintF>>(
cs: CS, cs: CS,
parameters: &CRHGadget::ParametersGadget, parameters: &CRHGadget::ParametersGadget,

View File

@@ -1,5 +1,6 @@
use crate::SignatureScheme; use crate::SignatureScheme;
use algebra::{ use algebra::{
ToConstraintField,
bytes::ToBytes, bytes::ToBytes,
fields::{Field, PrimeField}, fields::{Field, PrimeField},
groups::Group, groups::Group,
@@ -221,3 +222,12 @@ pub fn bytes_to_bits(bytes: &[u8]) -> Vec<bool> {
} }
bits bits
} }
impl<ConstraintF: Field, G: Group + ToConstraintField<ConstraintF>, D: Digest> ToConstraintField<ConstraintF>
for SchnorrSigParameters<G, D>
{
#[inline]
fn to_field_elements(&self) -> Result<Vec<ConstraintF>, Error> {
self.generator.to_field_elements()
}
}