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}
157
158/// Obtains the field variables
159pub trait ToConstraintFieldGadget<ConstraintF: algebra::PrimeField> {
160 fn to_constraint_field(
161 &self,
162 ) -> Result<Vec<crate::fields::fp::FpVar<ConstraintF>>, r1cs_core::SynthesisError>;
163}