arnaucube
arnaucube/ark-r1cs-stdPublic Self-hosted repository
ark-r1cs-std/r1cs-std/src/lib.rs
r1cs-std/src/lib.rsRaw
  1#![cfg_attr(not(feature = "std"), no_std)]
  2#![deny(unused_import_braces, unused_qualifications, trivial_casts)]
  3#![deny(trivial_numeric_casts, variant_size_differences, unreachable_pub)]
  4#![deny(non_shorthand_field_patterns, unused_attributes, unused_imports)]
  5#![deny(unused_extern_crates, renamed_and_removed_lints, unused_allocation)]
  6#![deny(unused_comparisons, bare_trait_objects, const_err, unused_must_use)]
  7#![deny(unused_mut, unused_unsafe, private_in_public, unsafe_code)]
  8#![forbid(unsafe_code)]
  9
 10#[cfg(all(test, not(feature = "std")))]
 11#[macro_use]
 12extern crate std;
 13
 14#[cfg(not(feature = "std"))]
 15extern crate alloc as ralloc;
 16
 17#[macro_use]
 18extern crate algebra;
 19
 20#[macro_use]
 21extern crate derivative;
 22
 23#[macro_use]
 24pub mod macros;
 25
 26#[cfg(not(feature = "std"))]
 27use ralloc::vec::Vec;
 28
 29#[cfg(feature = "std")]
 30use std::vec::Vec;
 31
 32use algebra::prelude::Field;
 33
 34pub mod bits;
 35pub use self::bits::*;
 36
 37pub mod fields;
 38
 39pub mod groups;
 40
 41mod instantiated;
 42
 43#[cfg(feature = "bls12_377")]
 44pub use instantiated::bls12_377;
 45
 46#[cfg(feature = "ed_on_bn254")]
 47pub use instantiated::ed_on_bn254;
 48
 49#[cfg(feature = "ed_on_bls12_377")]
 50pub use instantiated::ed_on_bls12_377;
 51
 52#[cfg(feature = "ed_on_mnt4_298")]
 53pub use instantiated::ed_on_mnt4_298;
 54
 55#[cfg(feature = "ed_on_mnt4_753")]
 56pub use instantiated::ed_on_mnt4_753;
 57
 58#[cfg(feature = "ed_on_cp6_782")]
 59pub use instantiated::ed_on_cp6_782;
 60
 61#[cfg(feature = "ed_on_bw6_761")]
 62pub use instantiated::ed_on_bw6_761;
 63
 64#[cfg(feature = "ed_on_bls12_381")]
 65pub use instantiated::ed_on_bls12_381;
 66
 67#[cfg(feature = "mnt4_298")]
 68pub use instantiated::mnt4_298;
 69
 70#[cfg(feature = "mnt4_753")]
 71pub use instantiated::mnt4_753;
 72
 73#[cfg(feature = "mnt6_298")]
 74pub use instantiated::mnt6_298;
 75
 76#[cfg(feature = "mnt6_753")]
 77pub use instantiated::mnt6_753;
 78
 79pub mod pairing;
 80
 81pub mod alloc;
 82pub mod eq;
 83pub mod select;
 84
 85pub mod prelude {
 86    pub use crate::{
 87        alloc::*,
 88        bits::{boolean::Boolean, uint32::UInt32, uint8::UInt8, ToBitsGadget, ToBytesGadget},
 89        eq::*,
 90        fields::{FieldOpsBounds, FieldVar},
 91        groups::{CurveVar, GroupOpsBounds},
 92        instantiated::*,
 93        pairing::PairingVar,
 94        select::*,
 95        R1CSVar,
 96    };
 97}
 98
 99pub trait R1CSVar<F: Field> {
100    type Value: core::fmt::Debug + Eq + Clone;
101
102    /// Returns the underlying `ConstraintSystemRef`.
103    fn cs(&self) -> Option<r1cs_core::ConstraintSystemRef<F>>;
104
105    /// Returns `true` if `self` is a circuit-generation-time constant.
106    fn is_constant(&self) -> bool {
107        self.cs()
108            .map_or(true, |cs| cs == r1cs_core::ConstraintSystemRef::None)
109    }
110
111    /// Returns the value that is assigned to `self` in the underlying
112    /// `ConstraintSystem`.
113    fn value(&self) -> Result<Self::Value, r1cs_core::SynthesisError>;
114}
115
116impl<F: Field, T: R1CSVar<F>> R1CSVar<F> for [T] {
117    type Value = Vec<T::Value>;
118
119    fn cs(&self) -> Option<r1cs_core::ConstraintSystemRef<F>> {
120        let mut result = None;
121        for var in self {
122            result = var.cs().or(result);
123        }
124        result
125    }
126
127    fn value(&self) -> Result<Self::Value, r1cs_core::SynthesisError> {
128        let mut result = Vec::new();
129        for var in self {
130            result.push(var.value()?);
131        }
132        Ok(result)
133    }
134}
135
136impl<'a, F: Field, T: 'a + R1CSVar<F>> R1CSVar<F> for &'a T {
137    type Value = T::Value;
138
139    fn cs(&self) -> Option<r1cs_core::ConstraintSystemRef<F>> {
140        (*self).cs()
141    }
142
143    fn value(&self) -> Result<Self::Value, r1cs_core::SynthesisError> {
144        (*self).value()
145    }
146}
147
148pub trait Assignment<T> {
149    fn get(self) -> Result<T, r1cs_core::SynthesisError>;
150}
151
152impl<T> Assignment<T> for Option<T> {
153    fn get(self) -> Result<T, r1cs_core::SynthesisError> {
154        self.ok_or(r1cs_core::SynthesisError::AssignmentMissing)
155    }
156}