Merge pull request #41 from AleoHQ/dependency/snarkos-master

Dependency/snarkos master
This commit is contained in:
Collin Chin 2020-06-05 17:07:38 -07:00 committed by GitHub
commit 99c0d27046
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
23 changed files with 668 additions and 835 deletions

113
Cargo.lock generated
View File

@ -260,6 +260,36 @@ dependencies = [
"subtle",
]
[[package]]
name = "curl"
version = "0.4.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "762e34611d2d5233a506a79072be944fddd057db2f18e04c0d6fa79e3fd466fd"
dependencies = [
"curl-sys",
"libc",
"openssl-probe",
"openssl-sys",
"schannel",
"socket2",
"winapi",
]
[[package]]
name = "curl-sys"
version = "0.4.31+curl-7.70.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dcd62757cc4f5ab9404bc6ca9f0ae447e729a1403948ce5106bd588ceac6a3b0"
dependencies = [
"cc",
"libc",
"libz-sys",
"openssl-sys",
"pkg-config",
"vcpkg",
"winapi",
]
[[package]]
name = "derivative"
version = "2.1.1"
@ -419,9 +449,9 @@ checksum = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e"
[[package]]
name = "jsonrpc-core"
version = "14.1.0"
version = "14.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "25525f6002338fb4debb5167a89a0b47f727a5a48418417545ad3429758b7fec"
checksum = "a0747307121ffb9703afd93afbd0fb4f854c38fb873f2c8b90e0e902f27c7b62"
dependencies = [
"futures",
"log",
@ -517,6 +547,18 @@ dependencies = [
"libc",
]
[[package]]
name = "libz-sys"
version = "1.0.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2eb5e43362e38e2bca2fd5f5134c4d4564a23a5c28e9b95411652021a8675ebe"
dependencies = [
"cc",
"libc",
"pkg-config",
"vcpkg",
]
[[package]]
name = "log"
version = "0.4.8"
@ -579,6 +621,25 @@ version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c"
[[package]]
name = "openssl-probe"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de"
[[package]]
name = "openssl-sys"
version = "0.9.57"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7410fef80af8ac071d4f63755c0ab89ac3df0fd1ea91f1d1f37cf5cec4395990"
dependencies = [
"autocfg",
"cc",
"libc",
"pkg-config",
"vcpkg",
]
[[package]]
name = "peeking_take_while"
version = "0.1.2"
@ -641,6 +702,12 @@ dependencies = [
"sha-1",
]
[[package]]
name = "pkg-config"
version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677"
[[package]]
name = "ppv-lite86"
version = "0.2.6"
@ -789,6 +856,12 @@ dependencies = [
"num_cpus",
]
[[package]]
name = "redox_syscall"
version = "0.1.56"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84"
[[package]]
name = "regex"
version = "1.3.4"
@ -835,6 +908,16 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8"
[[package]]
name = "schannel"
version = "0.1.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75"
dependencies = [
"lazy_static",
"winapi",
]
[[package]]
name = "scopeguard"
version = "1.1.0"
@ -920,6 +1003,7 @@ checksum = "c7cb5678e1615754284ec264d9bb5b4c27d2018577fd90ac0ceb578591ed5ee4"
[[package]]
name = "snarkos-algorithms"
version = "0.8.0"
source = "git+ssh://git@github.com/AleoHQ/snarkOS.git#ffef82772617e849badf05fbee283d9f34812d31"
dependencies = [
"blake2",
"derivative",
@ -938,6 +1022,7 @@ dependencies = [
[[package]]
name = "snarkos-curves"
version = "0.8.0"
source = "git+ssh://git@github.com/AleoHQ/snarkOS.git#ffef82772617e849badf05fbee283d9f34812d31"
dependencies = [
"derivative",
"rand",
@ -949,8 +1034,10 @@ dependencies = [
[[package]]
name = "snarkos-errors"
version = "0.8.0"
source = "git+ssh://git@github.com/AleoHQ/snarkOS.git#ffef82772617e849badf05fbee283d9f34812d31"
dependencies = [
"bincode",
"curl",
"hex",
"jsonrpc-core",
"rocksdb",
@ -960,6 +1047,7 @@ dependencies = [
[[package]]
name = "snarkos-gadgets"
version = "0.8.0"
source = "git+ssh://git@github.com/AleoHQ/snarkOS.git#ffef82772617e849badf05fbee283d9f34812d31"
dependencies = [
"derivative",
"digest",
@ -973,6 +1061,7 @@ dependencies = [
[[package]]
name = "snarkos-models"
version = "0.8.0"
source = "git+ssh://git@github.com/AleoHQ/snarkOS.git#ffef82772617e849badf05fbee283d9f34812d31"
dependencies = [
"derivative",
"rand",
@ -985,14 +1074,28 @@ dependencies = [
[[package]]
name = "snarkos-profiler"
version = "0.8.0"
source = "git+ssh://git@github.com/AleoHQ/snarkOS.git#ffef82772617e849badf05fbee283d9f34812d31"
[[package]]
name = "snarkos-utilities"
version = "0.8.0"
source = "git+ssh://git@github.com/AleoHQ/snarkOS.git#ffef82772617e849badf05fbee283d9f34812d31"
dependencies = [
"rand",
]
[[package]]
name = "socket2"
version = "0.3.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "03088793f677dce356f3ccc2edb1b314ad191ab702a5de3faf49304f7e104918"
dependencies = [
"cfg-if",
"libc",
"redox_syscall",
"winapi",
]
[[package]]
name = "strsim"
version = "0.8.0"
@ -1166,6 +1269,12 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
[[package]]
name = "vcpkg"
version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "55d1e41d56121e07f1e223db0a4def204e45c85425f6a16d462fd07c8d10d74c"
[[package]]
name = "vec_map"
version = "0.8.1"

View File

@ -18,12 +18,12 @@ members = [ "compiler" ]
[dependencies]
leo-compiler = { path = "compiler", version = "0.1.0" }
snarkos-algorithms = { path = "../snarkOS/algorithms", version = "0.8.0" }
snarkos-curves = { path = "../snarkOS/curves", version = "0.8.0" }
snarkos-errors = { path = "../snarkOS/errors", version = "0.8.0" }
snarkos-gadgets = { path = "../snarkOS/gadgets", version = "0.8.0" }
snarkos-models = { path = "../snarkOS/models", version = "0.8.0" }
snarkos-utilities = { path = "../snarkOS/utilities", version = "0.8.0" }
snarkos-algorithms = { git = "ssh://git@github.com/AleoHQ/snarkOS.git", version = "0.8.0" }
snarkos-curves = { git = "ssh://git@github.com/AleoHQ/snarkOS.git", version = "0.8.0" }
snarkos-errors = { git = "ssh://git@github.com/AleoHQ/snarkOS.git", version = "0.8.0" }
snarkos-gadgets = { git = "ssh://git@github.com/AleoHQ/snarkOS.git", version = "0.8.0" }
snarkos-models = { git = "ssh://git@github.com/AleoHQ/snarkOS.git", version = "0.8.0" }
snarkos-utilities = { git = "ssh://git@github.com/AleoHQ/snarkOS.git", version = "0.8.0" }
clap = { version = "2.33.0" }
colored = { version = "1.9" }

3
Leo.toml Normal file
View File

@ -0,0 +1,3 @@
[package]
name = "language"
version = "0.1.0"

View File

@ -5,12 +5,12 @@ authors = ["The Aleo Team <hello@aleo.org>"]
edition = "2018"
[dependencies]
snarkos-algorithms = { path = "../../snarkOS/algorithms", version = "0.8.0" }
snarkos-curves = { path = "../../snarkOS/curves", version = "0.8.0" }
snarkos-errors = { path = "../../snarkOS/errors", version = "0.8.0" }
snarkos-gadgets = { path = "../../snarkOS/gadgets", version = "0.8.0" }
snarkos-models = { path = "../../snarkOS/models", version = "0.8.0" }
snarkos-utilities = { path = "../../snarkOS/utilities", version = "0.8.0" }
snarkos-algorithms = { git = "ssh://git@github.com/AleoHQ/snarkOS.git", version = "0.8.0" }
snarkos-curves = { git = "ssh://git@github.com/AleoHQ/snarkOS.git", version = "0.8.0" }
snarkos-errors = { git = "ssh://git@github.com/AleoHQ/snarkOS.git", version = "0.8.0" }
snarkos-gadgets = { git = "ssh://git@github.com/AleoHQ/snarkOS.git", version = "0.8.0" }
snarkos-models = { git = "ssh://git@github.com/AleoHQ/snarkOS.git", version = "0.8.0" }
snarkos-utilities = { git = "ssh://git@github.com/AleoHQ/snarkOS.git", version = "0.8.0" }
thiserror = { version = "1.0" }
from-pest = { version = "0.3.1" }

View File

@ -58,7 +58,7 @@ impl<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>> Constraine
) -> Result<ConstrainedValue<F, G>, ExpressionError> {
match (left, right) {
(ConstrainedValue::Integer(num_1), ConstrainedValue::Integer(num_2)) => {
Ok(Self::enforce_integer_add(cs, num_1, num_2)?)
Ok(ConstrainedValue::Integer(num_1.add(cs, num_2)?))
}
(ConstrainedValue::Field(fe_1), ConstrainedValue::Field(fe_2)) => {
Ok(ConstrainedValue::Field(fe_1.add(cs, &fe_2)?))
@ -89,7 +89,7 @@ impl<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>> Constraine
) -> Result<ConstrainedValue<F, G>, ExpressionError> {
match (left, right) {
(ConstrainedValue::Integer(num_1), ConstrainedValue::Integer(num_2)) => {
Ok(Self::enforce_integer_sub(cs, num_1, num_2)?)
Ok(ConstrainedValue::Integer(num_1.sub(cs, num_2)?))
}
(ConstrainedValue::Field(fe_1), ConstrainedValue::Field(fe_2)) => {
Ok(ConstrainedValue::Field(fe_1.sub(cs, &fe_2)?))
@ -120,7 +120,7 @@ impl<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>> Constraine
) -> Result<ConstrainedValue<F, G>, ExpressionError> {
match (left, right) {
(ConstrainedValue::Integer(num_1), ConstrainedValue::Integer(num_2)) => {
Ok(Self::enforce_integer_mul(cs, num_1, num_2)?)
Ok(ConstrainedValue::Integer(num_1.mul(cs, num_2)?))
}
(ConstrainedValue::Field(fe_1), ConstrainedValue::Field(fe_2)) => {
Ok(ConstrainedValue::Field(fe_1.mul(cs, &fe_2)?))
@ -150,7 +150,7 @@ impl<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>> Constraine
) -> Result<ConstrainedValue<F, G>, ExpressionError> {
match (left, right) {
(ConstrainedValue::Integer(num_1), ConstrainedValue::Integer(num_2)) => {
Ok(Self::enforce_integer_div(cs, num_1, num_2)?)
Ok(ConstrainedValue::Integer(num_1.div(cs, num_2)?))
}
(ConstrainedValue::Field(fe_1), ConstrainedValue::Field(fe_2)) => {
Ok(ConstrainedValue::Field(fe_1.div(cs, &fe_2)?))
@ -179,7 +179,7 @@ impl<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>> Constraine
) -> Result<ConstrainedValue<F, G>, ExpressionError> {
match (left, right) {
(ConstrainedValue::Integer(num_1), ConstrainedValue::Integer(num_2)) => {
Ok(Self::enforce_integer_pow(cs, num_1, num_2)?)
Ok(ConstrainedValue::Integer(num_1.pow(cs, num_2)?))
}
(ConstrainedValue::Unresolved(string), val_2) => {
let val_1 = ConstrainedValue::from_other(string, &val_2)?;
@ -206,9 +206,9 @@ impl<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>> Constraine
(ConstrainedValue::Boolean(bool_1), ConstrainedValue::Boolean(bool_2)) => {
Ok(Self::boolean_eq(bool_1, bool_2))
}
(ConstrainedValue::Integer(num_1), ConstrainedValue::Integer(num_2)) => {
Ok(Self::evaluate_integer_eq(num_1, num_2)?)
}
(ConstrainedValue::Integer(num_1), ConstrainedValue::Integer(num_2)) => Ok(
ConstrainedValue::Boolean(Boolean::Constant(num_1.eq(&num_2))),
),
(ConstrainedValue::Field(fe_1), ConstrainedValue::Field(fe_2)) => {
Ok(ConstrainedValue::Boolean(Boolean::Constant(fe_1.eq(&fe_2))))
}
@ -820,7 +820,7 @@ impl<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>> Constraine
),
// Values
Expression::Integer(integer) => Ok(Self::get_integer_constant(integer)),
Expression::Integer(integer) => Ok(ConstrainedValue::Integer(integer)),
Expression::Field(field) => Ok(ConstrainedValue::Field(FieldType::constant(field)?)),
Expression::Group(group_affine) => {
Ok(ConstrainedValue::Group(G::constant(group_affine)?))

View File

@ -6,7 +6,7 @@ use crate::{
errors::{FunctionError, ImportError},
field_from_input, group_from_input,
types::{Expression, Function, Identifier, InputValue, Program, Type},
GroupType,
GroupType, Integer,
};
use snarkos_models::{
@ -176,9 +176,13 @@ impl<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>> Constraine
input_value: Option<InputValue>,
) -> Result<ConstrainedValue<F, G>, FunctionError> {
match _type {
Type::IntegerType(integer_type) => {
Ok(self.integer_from_parameter(cs, integer_type, name, private, input_value)?)
}
Type::IntegerType(integer_type) => Ok(ConstrainedValue::Integer(Integer::from_input(
cs,
integer_type,
name,
private,
input_value,
)?)),
Type::Field => Ok(field_from_input(cs, name, private, input_value)?),
Type::Group => Ok(group_from_input(cs, name, private, input_value)?),
Type::Boolean => Ok(self.bool_from_input(cs, name, private, input_value)?),

View File

@ -1,10 +1,9 @@
//! Methods to enforce constraints on integers in a resolved Leo program.
use crate::{
constraints::{ConstrainedProgram, ConstrainedValue},
errors::IntegerError,
types::{InputValue, Integer},
GroupType, IntegerType,
IntegerType,
};
use snarkos_errors::gadgets::SynthesisError;
@ -13,8 +12,11 @@ use snarkos_models::{
gadgets::{
r1cs::ConstraintSystem,
utilities::{
boolean::Boolean, select::CondSelectGadget, uint128::UInt128, uint16::UInt16,
uint32::UInt32, uint64::UInt64, uint8::UInt8,
alloc::AllocGadget,
boolean::Boolean,
eq::{ConditionalEqGadget, EqGadget},
select::CondSelectGadget,
uint::{UInt, UInt128, UInt16, UInt32, UInt64, UInt8},
},
},
};
@ -39,6 +41,511 @@ impl Integer {
Integer::U128(_u128) => IntegerType::U128,
}
}
pub(crate) fn from_input<F: Field, CS: ConstraintSystem<F>>(
cs: &mut CS,
integer_type: IntegerType,
name: String,
private: bool,
integer_value: Option<InputValue>,
) -> Result<Self, IntegerError> {
// Check that the input value is the correct type
let integer_option = match integer_value {
Some(input) => {
if let InputValue::Integer(integer) = input {
Some(integer)
} else {
return Err(IntegerError::InvalidInteger(input.to_string()));
}
}
None => None,
};
Ok(match integer_type {
IntegerType::U8 => {
let u8_option = integer_option.map(|integer| integer as u8);
let u8_result = match private {
true => UInt8::alloc(cs.ns(|| name), || {
u8_option.ok_or(SynthesisError::AssignmentMissing)
})?,
false => UInt8::alloc_input(cs.ns(|| name), || {
u8_option.ok_or(SynthesisError::AssignmentMissing)
})?,
};
Integer::U8(u8_result)
}
IntegerType::U16 => {
let u16_option = integer_option.map(|integer| integer as u16);
let u16_result = match private {
true => UInt16::alloc(cs.ns(|| name), || {
u16_option.ok_or(SynthesisError::AssignmentMissing)
})?,
false => UInt16::alloc_input(cs.ns(|| name), || {
u16_option.ok_or(SynthesisError::AssignmentMissing)
})?,
};
Integer::U16(u16_result)
}
IntegerType::U32 => {
let u32_option = integer_option.map(|integer| integer as u32);
let u32_result = match private {
true => UInt32::alloc(cs.ns(|| name), || {
u32_option.ok_or(SynthesisError::AssignmentMissing)
})?,
false => UInt32::alloc_input(cs.ns(|| name), || {
u32_option.ok_or(SynthesisError::AssignmentMissing)
})?,
};
Integer::U32(u32_result)
}
IntegerType::U64 => {
let u64_option = integer_option.map(|integer| integer as u64);
let u64_result = match private {
true => UInt64::alloc(cs.ns(|| name), || {
u64_option.ok_or(SynthesisError::AssignmentMissing)
})?,
false => UInt64::alloc_input(cs.ns(|| name), || {
u64_option.ok_or(SynthesisError::AssignmentMissing)
})?,
};
Integer::U64(u64_result)
}
IntegerType::U128 => {
let u128_option = integer_option.map(|integer| integer as u128);
let u128_result = match private {
true => UInt128::alloc(cs.ns(|| name), || {
u128_option.ok_or(SynthesisError::AssignmentMissing)
})?,
false => UInt128::alloc_input(cs.ns(|| name), || {
u128_option.ok_or(SynthesisError::AssignmentMissing)
})?,
};
Integer::U128(u128_result)
}
})
}
pub(crate) fn add<F: Field + PrimeField, CS: ConstraintSystem<F>>(
self,
cs: &mut CS,
other: Self,
) -> Result<Self, IntegerError> {
Ok(match (self, other) {
(Integer::U8(left_u8), Integer::U8(right_u8)) => {
let result = UInt8::addmany(
cs.ns(|| {
format!(
"enforce {} + {}",
left_u8.value.unwrap(),
right_u8.value.unwrap()
)
}),
&[left_u8, right_u8],
)?;
Integer::U8(result)
}
(Integer::U16(left_u16), Integer::U16(right_u16)) => {
let result = UInt16::addmany(
cs.ns(|| {
format!(
"enforce {} + {}",
left_u16.value.unwrap(),
right_u16.value.unwrap()
)
}),
&[left_u16, right_u16],
)?;
Integer::U16(result)
}
(Integer::U32(left_u32), Integer::U32(right_u32)) => {
let result = UInt32::addmany(
cs.ns(|| {
format!(
"enforce {} + {}",
left_u32.value.unwrap(),
right_u32.value.unwrap()
)
}),
&[left_u32, right_u32],
)?;
Integer::U32(result)
}
(Integer::U64(left_u64), Integer::U64(right_u64)) => {
let result = UInt64::addmany(
cs.ns(|| {
format!(
"enforce {} + {}",
left_u64.value.unwrap(),
right_u64.value.unwrap()
)
}),
&[left_u64, right_u64],
)?;
Integer::U64(result)
}
(Integer::U128(left_u128), Integer::U128(right_u128)) => {
let result = UInt128::addmany(
cs.ns(|| {
format!(
"enforce {} + {}",
left_u128.value.unwrap(),
right_u128.value.unwrap()
)
}),
&[left_u128, right_u128],
)?;
Integer::U128(result)
}
(left, right) => {
return Err(IntegerError::CannotEnforce(format!("{} + {}", left, right)))
}
})
}
pub(crate) fn sub<F: Field + PrimeField, CS: ConstraintSystem<F>>(
self,
cs: &mut CS,
other: Self,
) -> Result<Self, IntegerError> {
Ok(match (self, other) {
(Integer::U8(left_u8), Integer::U8(right_u8)) => {
let result = left_u8.sub(
cs.ns(|| {
format!(
"enforce {} - {}",
left_u8.value.unwrap(),
right_u8.value.unwrap()
)
}),
&right_u8,
)?;
Integer::U8(result)
}
(Integer::U16(left_u16), Integer::U16(right_u16)) => {
let result = left_u16.sub(
cs.ns(|| {
format!(
"enforce {} - {}",
left_u16.value.unwrap(),
right_u16.value.unwrap()
)
}),
&right_u16,
)?;
Integer::U16(result)
}
(Integer::U32(left_u32), Integer::U32(right_u32)) => {
let result = left_u32.sub(
cs.ns(|| {
format!(
"enforce {} - {}",
left_u32.value.unwrap(),
right_u32.value.unwrap()
)
}),
&right_u32,
)?;
Integer::U32(result)
}
(Integer::U64(left_u64), Integer::U64(right_u64)) => {
let result = left_u64.sub(
cs.ns(|| {
format!(
"enforce {} - {}",
left_u64.value.unwrap(),
right_u64.value.unwrap()
)
}),
&right_u64,
)?;
Integer::U64(result)
}
(Integer::U128(left_u128), Integer::U128(right_u128)) => {
let result = left_u128.sub(
cs.ns(|| {
format!(
"enforce {} - {}",
left_u128.value.unwrap(),
right_u128.value.unwrap()
)
}),
&right_u128,
)?;
Integer::U128(result)
}
(left, right) => {
return Err(IntegerError::CannotEnforce(format!("{} - {}", left, right)))
}
})
}
pub(crate) fn mul<F: Field + PrimeField, CS: ConstraintSystem<F>>(
self,
cs: &mut CS,
other: Self,
) -> Result<Self, IntegerError> {
Ok(match (self, other) {
(Integer::U8(left_u8), Integer::U8(right_u8)) => {
let result = left_u8.mul(
cs.ns(|| {
format!(
"enforce {} * {}",
left_u8.value.unwrap(),
right_u8.value.unwrap()
)
}),
&right_u8,
)?;
Integer::U8(result)
}
(Integer::U16(left_u16), Integer::U16(right_u16)) => {
let result = left_u16.mul(
cs.ns(|| {
format!(
"enforce {} * {}",
left_u16.value.unwrap(),
right_u16.value.unwrap()
)
}),
&right_u16,
)?;
Integer::U16(result)
}
(Integer::U32(left_u32), Integer::U32(right_u32)) => {
let result = left_u32.mul(
cs.ns(|| {
format!(
"enforce {} * {}",
left_u32.value.unwrap(),
right_u32.value.unwrap()
)
}),
&right_u32,
)?;
Integer::U32(result)
}
(Integer::U64(left_u64), Integer::U64(right_u64)) => {
let result = left_u64.mul(
cs.ns(|| {
format!(
"enforce {} * {}",
left_u64.value.unwrap(),
right_u64.value.unwrap()
)
}),
&right_u64,
)?;
Integer::U64(result)
}
(Integer::U128(left_u128), Integer::U128(right_u128)) => {
let result = left_u128.mul(
cs.ns(|| {
format!(
"enforce {} * {}",
left_u128.value.unwrap(),
right_u128.value.unwrap()
)
}),
&right_u128,
)?;
Integer::U128(result)
}
(left, right) => {
return Err(IntegerError::CannotEnforce(format!("{} * {}", left, right)))
}
})
}
pub(crate) fn div<F: Field + PrimeField, CS: ConstraintSystem<F>>(
self,
cs: &mut CS,
other: Self,
) -> Result<Self, IntegerError> {
Ok(match (self, other) {
(Integer::U8(left_u8), Integer::U8(right_u8)) => {
let result = left_u8.div(
cs.ns(|| {
format!(
"enforce {} / {}",
left_u8.value.unwrap(),
right_u8.value.unwrap()
)
}),
&right_u8,
)?;
Integer::U8(result)
}
(Integer::U16(left_u16), Integer::U16(right_u16)) => {
let result = left_u16.div(
cs.ns(|| {
format!(
"enforce {} / {}",
left_u16.value.unwrap(),
right_u16.value.unwrap()
)
}),
&right_u16,
)?;
Integer::U16(result)
}
(Integer::U32(left_u32), Integer::U32(right_u32)) => {
let result = left_u32.div(
cs.ns(|| {
format!(
"enforce {} / {}",
left_u32.value.unwrap(),
right_u32.value.unwrap()
)
}),
&right_u32,
)?;
Integer::U32(result)
}
(Integer::U64(left_u64), Integer::U64(right_u64)) => {
let result = left_u64.div(
cs.ns(|| {
format!(
"enforce {} / {}",
left_u64.value.unwrap(),
right_u64.value.unwrap()
)
}),
&right_u64,
)?;
Integer::U64(result)
}
(Integer::U128(left_u128), Integer::U128(right_u128)) => {
let result = left_u128.div(
cs.ns(|| {
format!(
"enforce {} / {}",
left_u128.value.unwrap(),
right_u128.value.unwrap()
)
}),
&right_u128,
)?;
Integer::U128(result)
}
(left, right) => {
return Err(IntegerError::CannotEnforce(format!("{} / {}", left, right)))
}
})
}
pub(crate) fn pow<F: Field + PrimeField, CS: ConstraintSystem<F>>(
self,
cs: &mut CS,
other: Self,
) -> Result<Self, IntegerError> {
Ok(match (self, other) {
(Integer::U8(left_u8), Integer::U8(right_u8)) => {
let result = left_u8.pow(
cs.ns(|| {
format!(
"enforce {} ** {}",
left_u8.value.unwrap(),
right_u8.value.unwrap()
)
}),
&right_u8,
)?;
Integer::U8(result)
}
(Integer::U16(left_u16), Integer::U16(right_u16)) => {
let result = left_u16.pow(
cs.ns(|| {
format!(
"enforce {} ** {}",
left_u16.value.unwrap(),
right_u16.value.unwrap()
)
}),
&right_u16,
)?;
Integer::U16(result)
}
(Integer::U32(left_u32), Integer::U32(right_u32)) => {
let result = left_u32.pow(
cs.ns(|| {
format!(
"enforce {} ** {}",
left_u32.value.unwrap(),
right_u32.value.unwrap()
)
}),
&right_u32,
)?;
Integer::U32(result)
}
(Integer::U64(left_u64), Integer::U64(right_u64)) => {
let result = left_u64.pow(
cs.ns(|| {
format!(
"enforce {} ** {}",
left_u64.value.unwrap(),
right_u64.value.unwrap()
)
}),
&right_u64,
)?;
Integer::U64(result)
}
(Integer::U128(left_u128), Integer::U128(right_u128)) => {
let result = left_u128.pow(
cs.ns(|| {
format!(
"enforce {} ** {}",
left_u128.value.unwrap(),
right_u128.value.unwrap()
)
}),
&right_u128,
)?;
Integer::U128(result)
}
(left, right) => {
return Err(IntegerError::CannotEnforce(format!(
"{} ** {}",
left, right
)))
}
})
}
}
impl<F: Field + PrimeField> EqGadget<F> for Integer {}
impl<F: Field + PrimeField> ConditionalEqGadget<F> for Integer {
fn conditional_enforce_equal<CS: ConstraintSystem<F>>(
&self,
cs: CS,
other: &Self,
condition: &Boolean,
) -> Result<(), SynthesisError> {
match (self, other) {
(Integer::U8(left_u8), Integer::U8(right_u8)) => {
left_u8.conditional_enforce_equal(cs, right_u8, condition)
}
(Integer::U16(left_u16), Integer::U16(right_u16)) => {
left_u16.conditional_enforce_equal(cs, right_u16, condition)
}
(Integer::U32(left_u32), Integer::U32(right_u32)) => {
left_u32.conditional_enforce_equal(cs, right_u32, condition)
}
(Integer::U64(left_u64), Integer::U64(right_u64)) => {
left_u64.conditional_enforce_equal(cs, right_u64, condition)
}
(Integer::U128(left_u128), Integer::U128(right_u128)) => {
left_u128.conditional_enforce_equal(cs, right_u128, condition)
}
(_, _) => Err(SynthesisError::AssignmentMissing),
}
}
fn cost() -> usize {
<UInt128 as ConditionalEqGadget<F>>::cost()
}
}
impl<F: Field + PrimeField> CondSelectGadget<F> for Integer {
@ -72,223 +579,3 @@ impl<F: Field + PrimeField> CondSelectGadget<F> for Integer {
unimplemented!("Cannot calculate cost.")
}
}
impl<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>> ConstrainedProgram<F, G, CS> {
pub(crate) fn get_integer_constant(integer: Integer) -> ConstrainedValue<F, G> {
ConstrainedValue::Integer(integer)
}
pub(crate) fn evaluate_integer_eq(
left: Integer,
right: Integer,
) -> Result<ConstrainedValue<F, G>, IntegerError> {
Ok(ConstrainedValue::Boolean(Boolean::Constant(
match (left, right) {
(Integer::U8(left_u8), Integer::U8(right_u8)) => left_u8.eq(&right_u8),
(Integer::U16(left_u16), Integer::U16(right_u16)) => left_u16.eq(&right_u16),
(Integer::U32(left_u32), Integer::U32(right_u32)) => left_u32.eq(&right_u32),
(Integer::U64(left_u64), Integer::U64(right_u64)) => left_u64.eq(&right_u64),
(Integer::U128(left_u128), Integer::U128(right_u128)) => left_u128.eq(&right_u128),
(left, right) => {
return Err(IntegerError::CannotEvaluate(format!(
"{} == {}",
left, right
)))
}
},
)))
}
pub(crate) fn integer_from_parameter(
&mut self,
cs: &mut CS,
integer_type: IntegerType,
name: String,
private: bool,
integer_value: Option<InputValue>,
) -> Result<ConstrainedValue<F, G>, IntegerError> {
// Check that the input value is the correct type
let integer_option = match integer_value {
Some(input) => {
if let InputValue::Integer(integer) = input {
Some(integer)
} else {
return Err(IntegerError::InvalidInteger(input.to_string()));
}
}
None => None,
};
match integer_type {
IntegerType::U8 => self.u8_from_input(cs, name, private, integer_option),
IntegerType::U16 => self.u16_from_input(cs, name, private, integer_option),
IntegerType::U32 => self.u32_from_input(cs, name, private, integer_option),
IntegerType::U64 => self.u64_from_input(cs, name, private, integer_option),
IntegerType::U128 => self.u128_from_input(cs, name, private, integer_option),
}
}
pub(crate) fn enforce_integer_eq(
cs: &mut CS,
left: Integer,
right: Integer,
) -> Result<(), IntegerError> {
match (left, right) {
(Integer::U8(left_u8), Integer::U8(right_u8)) => {
Self::enforce_u8_eq(cs, left_u8, right_u8)
}
(Integer::U16(left_u16), Integer::U16(right_u16)) => {
Self::enforce_u16_eq(cs, left_u16, right_u16)
}
(Integer::U32(left_u32), Integer::U32(right_u32)) => {
Self::enforce_u32_eq(cs, left_u32, right_u32)
}
(Integer::U64(left_u64), Integer::U64(right_u64)) => {
Self::enforce_u64_eq(cs, left_u64, right_u64)
}
(Integer::U128(left_u128), Integer::U128(right_u128)) => {
Self::enforce_u128_eq(cs, left_u128, right_u128)
}
(left, right) => {
return Err(IntegerError::CannotEnforce(format!(
"{} == {}",
left, right
)))
}
}
}
pub(crate) fn enforce_integer_add(
cs: &mut CS,
left: Integer,
right: Integer,
) -> Result<ConstrainedValue<F, G>, IntegerError> {
Ok(ConstrainedValue::Integer(match (left, right) {
(Integer::U8(left_u8), Integer::U8(right_u8)) => {
Integer::U8(Self::enforce_u8_add(cs, left_u8, right_u8)?)
}
(Integer::U16(left_u16), Integer::U16(right_u16)) => {
Integer::U16(Self::enforce_u16_add(cs, left_u16, right_u16)?)
}
(Integer::U32(left_u32), Integer::U32(right_u32)) => {
Integer::U32(Self::enforce_u32_add(cs, left_u32, right_u32)?)
}
(Integer::U64(left_u64), Integer::U64(right_u64)) => {
Integer::U64(Self::enforce_u64_add(cs, left_u64, right_u64)?)
}
(Integer::U128(left_u128), Integer::U128(right_u128)) => {
Integer::U128(Self::enforce_u128_add(cs, left_u128, right_u128)?)
}
(left, right) => {
return Err(IntegerError::CannotEnforce(format!("{} + {}", left, right)))
}
}))
}
pub(crate) fn enforce_integer_sub(
cs: &mut CS,
left: Integer,
right: Integer,
) -> Result<ConstrainedValue<F, G>, IntegerError> {
Ok(ConstrainedValue::Integer(match (left, right) {
(Integer::U8(left_u8), Integer::U8(right_u8)) => {
Integer::U8(Self::enforce_u8_sub(cs, left_u8, right_u8)?)
}
(Integer::U16(left_u16), Integer::U16(right_u16)) => {
Integer::U16(Self::enforce_u16_sub(cs, left_u16, right_u16)?)
}
(Integer::U32(left_u32), Integer::U32(right_u32)) => {
Integer::U32(Self::enforce_u32_sub(cs, left_u32, right_u32)?)
}
(Integer::U64(left_u64), Integer::U64(right_u64)) => {
Integer::U64(Self::enforce_u64_sub(cs, left_u64, right_u64)?)
}
(Integer::U128(left_u128), Integer::U128(right_u128)) => {
Integer::U128(Self::enforce_u128_sub(cs, left_u128, right_u128)?)
}
(left, right) => {
return Err(IntegerError::CannotEnforce(format!("{} - {}", left, right)))
}
}))
}
pub(crate) fn enforce_integer_mul(
cs: &mut CS,
left: Integer,
right: Integer,
) -> Result<ConstrainedValue<F, G>, IntegerError> {
Ok(ConstrainedValue::Integer(match (left, right) {
(Integer::U8(left_u8), Integer::U8(right_u8)) => {
Integer::U8(Self::enforce_u8_mul(cs, left_u8, right_u8)?)
}
(Integer::U16(left_u16), Integer::U16(right_u16)) => {
Integer::U16(Self::enforce_u16_mul(cs, left_u16, right_u16)?)
}
(Integer::U32(left_u32), Integer::U32(right_u32)) => {
Integer::U32(Self::enforce_u32_mul(cs, left_u32, right_u32)?)
}
(Integer::U64(left_u64), Integer::U64(right_u64)) => {
Integer::U64(Self::enforce_u64_mul(cs, left_u64, right_u64)?)
}
(Integer::U128(left_u128), Integer::U128(right_u128)) => {
Integer::U128(Self::enforce_u128_mul(cs, left_u128, right_u128)?)
}
(left, right) => {
return Err(IntegerError::CannotEnforce(format!("{} * {}", left, right)))
}
}))
}
pub(crate) fn enforce_integer_div(
cs: &mut CS,
left: Integer,
right: Integer,
) -> Result<ConstrainedValue<F, G>, IntegerError> {
Ok(ConstrainedValue::Integer(match (left, right) {
(Integer::U8(left_u8), Integer::U8(right_u8)) => {
Integer::U8(Self::enforce_u8_div(cs, left_u8, right_u8)?)
}
(Integer::U16(left_u16), Integer::U16(right_u16)) => {
Integer::U16(Self::enforce_u16_div(cs, left_u16, right_u16)?)
}
(Integer::U32(left_u32), Integer::U32(right_u32)) => {
Integer::U32(Self::enforce_u32_div(cs, left_u32, right_u32)?)
}
(Integer::U64(left_u64), Integer::U64(right_u64)) => {
Integer::U64(Self::enforce_u64_div(cs, left_u64, right_u64)?)
}
(Integer::U128(left_u128), Integer::U128(right_u128)) => {
Integer::U128(Self::enforce_u128_div(cs, left_u128, right_u128)?)
}
(left, right) => {
return Err(IntegerError::CannotEnforce(format!("{} / {}", left, right)))
}
}))
}
pub(crate) fn enforce_integer_pow(
cs: &mut CS,
left: Integer,
right: Integer,
) -> Result<ConstrainedValue<F, G>, IntegerError> {
Ok(ConstrainedValue::Integer(match (left, right) {
(Integer::U8(left_u8), Integer::U8(right_u8)) => {
Integer::U8(Self::enforce_u8_pow(cs, left_u8, right_u8)?)
}
(Integer::U16(left_u16), Integer::U16(right_u16)) => {
Integer::U16(Self::enforce_u16_pow(cs, left_u16, right_u16)?)
}
(Integer::U32(left_u32), Integer::U32(right_u32)) => {
Integer::U32(Self::enforce_u32_pow(cs, left_u32, right_u32)?)
}
(Integer::U64(left_u64), Integer::U64(right_u64)) => {
Integer::U64(Self::enforce_u64_pow(cs, left_u64, right_u64)?)
}
(Integer::U128(left_u128), Integer::U128(right_u128)) => {
Integer::U128(Self::enforce_u128_pow(cs, left_u128, right_u128)?)
}
(left, right) => {
return Err(IntegerError::CannotEnforce(format!(
"{} ** {}",
left, right
)))
}
}))
}
}

View File

@ -2,18 +2,3 @@
pub mod integer;
pub use integer::*;
pub mod uint8;
pub use uint8::*;
pub mod uint16;
pub use uint16::*;
pub mod uint32;
pub use uint32::*;
pub mod uint64;
pub use uint64::*;
pub mod uint128;
pub use uint128::*;

View File

@ -1,111 +0,0 @@
//! Methods to enforce constraints on uint128s in a resolved Leo program.
use crate::{
constraints::{ConstrainedProgram, ConstrainedValue},
errors::IntegerError,
types::Integer,
GroupType,
};
use snarkos_errors::gadgets::SynthesisError;
use snarkos_models::{
curves::{Field, PrimeField},
gadgets::{
r1cs::ConstraintSystem,
utilities::{alloc::AllocGadget, eq::EqGadget, uint128::UInt128},
},
};
impl<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>> ConstrainedProgram<F, G, CS> {
pub(crate) fn u128_from_input(
&mut self,
cs: &mut CS,
name: String,
private: bool,
integer_option: Option<usize>,
) -> Result<ConstrainedValue<F, G>, IntegerError> {
// Type cast to u128 in rust.
// If this fails should we return our own error?
let u128_option = integer_option.map(|integer| integer as u128);
// Check visibility of parameter
let integer_value = if private {
UInt128::alloc(cs.ns(|| name), || {
u128_option.ok_or(SynthesisError::AssignmentMissing)
})?
} else {
UInt128::alloc_input(cs.ns(|| name), || {
u128_option.ok_or(SynthesisError::AssignmentMissing)
})?
};
Ok(ConstrainedValue::Integer(Integer::U128(integer_value)))
}
pub(crate) fn enforce_u128_eq(
cs: &mut CS,
left: UInt128,
right: UInt128,
) -> Result<(), IntegerError> {
Ok(left.enforce_equal(cs.ns(|| format!("enforce u128 equal")), &right)?)
}
pub(crate) fn enforce_u128_add(
cs: &mut CS,
left: UInt128,
right: UInt128,
) -> Result<UInt128, IntegerError> {
Ok(UInt128::addmany(
cs.ns(|| format!("enforce {} + {}", left.value.unwrap(), right.value.unwrap())),
&[left, right],
)?)
}
pub(crate) fn enforce_u128_sub(
cs: &mut CS,
left: UInt128,
right: UInt128,
) -> Result<UInt128, IntegerError> {
Ok(left.sub(
cs.ns(|| format!("enforce {} - {}", left.value.unwrap(), right.value.unwrap())),
&right,
)?)
}
pub(crate) fn enforce_u128_mul(
cs: &mut CS,
left: UInt128,
right: UInt128,
) -> Result<UInt128, IntegerError> {
Ok(left.mul(
cs.ns(|| format!("enforce {} * {}", left.value.unwrap(), right.value.unwrap())),
&right,
)?)
}
pub(crate) fn enforce_u128_div(
cs: &mut CS,
left: UInt128,
right: UInt128,
) -> Result<UInt128, IntegerError> {
Ok(left.div(
cs.ns(|| format!("enforce {} / {}", left.value.unwrap(), right.value.unwrap())),
&right,
)?)
}
pub(crate) fn enforce_u128_pow(
cs: &mut CS,
left: UInt128,
right: UInt128,
) -> Result<UInt128, IntegerError> {
Ok(left.pow(
cs.ns(|| {
format!(
"enforce {} ** {}",
left.value.unwrap(),
right.value.unwrap()
)
}),
&right,
)?)
}
}

View File

@ -1,111 +0,0 @@
//! Methods to enforce constraints on uint16s in a resolved Leo program.
use crate::{
constraints::{ConstrainedProgram, ConstrainedValue},
errors::IntegerError,
types::Integer,
GroupType,
};
use snarkos_errors::gadgets::SynthesisError;
use snarkos_models::{
curves::{Field, PrimeField},
gadgets::{
r1cs::ConstraintSystem,
utilities::{alloc::AllocGadget, eq::EqGadget, uint16::UInt16},
},
};
impl<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>> ConstrainedProgram<F, G, CS> {
pub(crate) fn u16_from_input(
&mut self,
cs: &mut CS,
name: String,
private: bool,
integer_option: Option<usize>,
) -> Result<ConstrainedValue<F, G>, IntegerError> {
// Type cast to u16 in rust.
// If this fails should we return our own error?
let u16_option = integer_option.map(|integer| integer as u16);
// Check visibility of parameter
let integer_value = if private {
UInt16::alloc(cs.ns(|| name), || {
u16_option.ok_or(SynthesisError::AssignmentMissing)
})?
} else {
UInt16::alloc_input(cs.ns(|| name), || {
u16_option.ok_or(SynthesisError::AssignmentMissing)
})?
};
Ok(ConstrainedValue::Integer(Integer::U16(integer_value)))
}
pub(crate) fn enforce_u16_eq(
cs: &mut CS,
left: UInt16,
right: UInt16,
) -> Result<(), IntegerError> {
Ok(left.enforce_equal(cs.ns(|| format!("enforce u16 equal")), &right)?)
}
pub(crate) fn enforce_u16_add(
cs: &mut CS,
left: UInt16,
right: UInt16,
) -> Result<UInt16, IntegerError> {
Ok(UInt16::addmany(
cs.ns(|| format!("enforce {} + {}", left.value.unwrap(), right.value.unwrap())),
&[left, right],
)?)
}
pub(crate) fn enforce_u16_sub(
cs: &mut CS,
left: UInt16,
right: UInt16,
) -> Result<UInt16, IntegerError> {
Ok(left.sub(
cs.ns(|| format!("enforce {} - {}", left.value.unwrap(), right.value.unwrap())),
&right,
)?)
}
pub(crate) fn enforce_u16_mul(
cs: &mut CS,
left: UInt16,
right: UInt16,
) -> Result<UInt16, IntegerError> {
Ok(left.mul(
cs.ns(|| format!("enforce {} * {}", left.value.unwrap(), right.value.unwrap())),
&right,
)?)
}
pub(crate) fn enforce_u16_div(
cs: &mut CS,
left: UInt16,
right: UInt16,
) -> Result<UInt16, IntegerError> {
Ok(left.div(
cs.ns(|| format!("enforce {} / {}", left.value.unwrap(), right.value.unwrap())),
&right,
)?)
}
pub(crate) fn enforce_u16_pow(
cs: &mut CS,
left: UInt16,
right: UInt16,
) -> Result<UInt16, IntegerError> {
Ok(left.pow(
cs.ns(|| {
format!(
"enforce {} ** {}",
left.value.unwrap(),
right.value.unwrap()
)
}),
&right,
)?)
}
}

View File

@ -1,111 +0,0 @@
//! Methods to enforce constraints on uint32s in a resolved Leo program.
use crate::{
constraints::{ConstrainedProgram, ConstrainedValue},
errors::IntegerError,
types::Integer,
GroupType,
};
use snarkos_errors::gadgets::SynthesisError;
use snarkos_models::{
curves::{Field, PrimeField},
gadgets::{
r1cs::ConstraintSystem,
utilities::{alloc::AllocGadget, eq::EqGadget, uint32::UInt32},
},
};
impl<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>> ConstrainedProgram<F, G, CS> {
pub(crate) fn u32_from_input(
&mut self,
cs: &mut CS,
name: String,
private: bool,
integer_option: Option<usize>,
) -> Result<ConstrainedValue<F, G>, IntegerError> {
// Type cast to integers.u32 in rust.
// If this fails should we return our own error?
let u32_option = integer_option.map(|integer| integer as u32);
// Check visibility of parameter
let integer_value = if private {
UInt32::alloc(cs.ns(|| name), || {
u32_option.ok_or(SynthesisError::AssignmentMissing)
})?
} else {
UInt32::alloc_input(cs.ns(|| name), || {
u32_option.ok_or(SynthesisError::AssignmentMissing)
})?
};
Ok(ConstrainedValue::Integer(Integer::U32(integer_value)))
}
pub(crate) fn enforce_u32_eq(
cs: &mut CS,
left: UInt32,
right: UInt32,
) -> Result<(), IntegerError> {
Ok(left.enforce_equal(cs.ns(|| format!("enforce integers.u32 equal")), &right)?)
}
pub(crate) fn enforce_u32_add(
cs: &mut CS,
left: UInt32,
right: UInt32,
) -> Result<UInt32, IntegerError> {
Ok(UInt32::addmany(
cs.ns(|| format!("enforce {} + {}", left.value.unwrap(), right.value.unwrap())),
&[left, right],
)?)
}
pub(crate) fn enforce_u32_sub(
cs: &mut CS,
left: UInt32,
right: UInt32,
) -> Result<UInt32, IntegerError> {
Ok(left.sub(
cs.ns(|| format!("enforce {} - {}", left.value.unwrap(), right.value.unwrap())),
&right,
)?)
}
pub(crate) fn enforce_u32_mul(
cs: &mut CS,
left: UInt32,
right: UInt32,
) -> Result<UInt32, IntegerError> {
Ok(left.mul(
cs.ns(|| format!("enforce {} * {}", left.value.unwrap(), right.value.unwrap())),
&right,
)?)
}
pub(crate) fn enforce_u32_div(
cs: &mut CS,
left: UInt32,
right: UInt32,
) -> Result<UInt32, IntegerError> {
Ok(left.div(
cs.ns(|| format!("enforce {} / {}", left.value.unwrap(), right.value.unwrap())),
&right,
)?)
}
pub(crate) fn enforce_u32_pow(
cs: &mut CS,
left: UInt32,
right: UInt32,
) -> Result<UInt32, IntegerError> {
Ok(left.pow(
cs.ns(|| {
format!(
"enforce {} ** {}",
left.value.unwrap(),
right.value.unwrap()
)
}),
&right,
)?)
}
}

View File

@ -1,111 +0,0 @@
//! Methods to enforce constraints on uint64s in a resolved Leo program.
use crate::{
constraints::{ConstrainedProgram, ConstrainedValue},
errors::IntegerError,
types::Integer,
GroupType,
};
use snarkos_errors::gadgets::SynthesisError;
use snarkos_models::{
curves::{Field, PrimeField},
gadgets::{
r1cs::ConstraintSystem,
utilities::{alloc::AllocGadget, eq::EqGadget, uint64::UInt64},
},
};
impl<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>> ConstrainedProgram<F, G, CS> {
pub(crate) fn u64_from_input(
&mut self,
cs: &mut CS,
name: String,
private: bool,
integer_option: Option<usize>,
) -> Result<ConstrainedValue<F, G>, IntegerError> {
// Type cast to u64 in rust.
// If this fails should we return our own error?
let u64_option = integer_option.map(|integer| integer as u64);
// Check visibility of parameter
let integer_value = if private {
UInt64::alloc(cs.ns(|| name), || {
u64_option.ok_or(SynthesisError::AssignmentMissing)
})?
} else {
UInt64::alloc_input(cs.ns(|| name), || {
u64_option.ok_or(SynthesisError::AssignmentMissing)
})?
};
Ok(ConstrainedValue::Integer(Integer::U64(integer_value)))
}
pub(crate) fn enforce_u64_eq(
cs: &mut CS,
left: UInt64,
right: UInt64,
) -> Result<(), IntegerError> {
Ok(left.enforce_equal(cs.ns(|| format!("enforce u64 equal")), &right)?)
}
pub(crate) fn enforce_u64_add(
cs: &mut CS,
left: UInt64,
right: UInt64,
) -> Result<UInt64, IntegerError> {
Ok(UInt64::addmany(
cs.ns(|| format!("enforce {} + {}", left.value.unwrap(), right.value.unwrap())),
&[left, right],
)?)
}
pub(crate) fn enforce_u64_sub(
cs: &mut CS,
left: UInt64,
right: UInt64,
) -> Result<UInt64, IntegerError> {
Ok(left.sub(
cs.ns(|| format!("enforce {} - {}", left.value.unwrap(), right.value.unwrap())),
&right,
)?)
}
pub(crate) fn enforce_u64_mul(
cs: &mut CS,
left: UInt64,
right: UInt64,
) -> Result<UInt64, IntegerError> {
Ok(left.mul(
cs.ns(|| format!("enforce {} * {}", left.value.unwrap(), right.value.unwrap())),
&right,
)?)
}
pub(crate) fn enforce_u64_div(
cs: &mut CS,
left: UInt64,
right: UInt64,
) -> Result<UInt64, IntegerError> {
Ok(left.div(
cs.ns(|| format!("enforce {} / {}", left.value.unwrap(), right.value.unwrap())),
&right,
)?)
}
pub(crate) fn enforce_u64_pow(
cs: &mut CS,
left: UInt64,
right: UInt64,
) -> Result<UInt64, IntegerError> {
Ok(left.pow(
cs.ns(|| {
format!(
"enforce {} ** {}",
left.value.unwrap(),
right.value.unwrap()
)
}),
&right,
)?)
}
}

View File

@ -1,111 +0,0 @@
//! Methods to enforce constraints on uint8s in a resolved Leo program.
use crate::{
constraints::{ConstrainedProgram, ConstrainedValue},
errors::IntegerError,
types::Integer,
GroupType,
};
use snarkos_errors::gadgets::SynthesisError;
use snarkos_models::{
curves::{Field, PrimeField},
gadgets::{
r1cs::ConstraintSystem,
utilities::{alloc::AllocGadget, eq::EqGadget, uint8::UInt8},
},
};
impl<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>> ConstrainedProgram<F, G, CS> {
pub(crate) fn u8_from_input(
&mut self,
cs: &mut CS,
name: String,
private: bool,
integer_option: Option<usize>,
) -> Result<ConstrainedValue<F, G>, IntegerError> {
// Type cast to u8 in rust.
// If this fails should we return our own error?
let u8_option = integer_option.map(|integer| integer as u8);
// Check visibility of parameter
let integer_value = if private {
UInt8::alloc(cs.ns(|| name), || {
u8_option.ok_or(SynthesisError::AssignmentMissing)
})?
} else {
UInt8::alloc_input(cs.ns(|| name), || {
u8_option.ok_or(SynthesisError::AssignmentMissing)
})?
};
Ok(ConstrainedValue::Integer(Integer::U8(integer_value)))
}
pub(crate) fn enforce_u8_eq(
cs: &mut CS,
left: UInt8,
right: UInt8,
) -> Result<(), IntegerError> {
Ok(left.enforce_equal(cs.ns(|| format!("enforce u8 equal")), &right)?)
}
pub(crate) fn enforce_u8_add(
cs: &mut CS,
left: UInt8,
right: UInt8,
) -> Result<UInt8, IntegerError> {
Ok(UInt8::addmany(
cs.ns(|| format!("enforce {} + {}", left.value.unwrap(), right.value.unwrap())),
&[left, right],
)?)
}
pub(crate) fn enforce_u8_sub(
cs: &mut CS,
left: UInt8,
right: UInt8,
) -> Result<UInt8, IntegerError> {
Ok(left.sub(
cs.ns(|| format!("enforce {} - {}", left.value.unwrap(), right.value.unwrap())),
&right,
)?)
}
pub(crate) fn enforce_u8_mul(
cs: &mut CS,
left: UInt8,
right: UInt8,
) -> Result<UInt8, IntegerError> {
Ok(left.mul(
cs.ns(|| format!("enforce {} * {}", left.value.unwrap(), right.value.unwrap())),
&right,
)?)
}
pub(crate) fn enforce_u8_div(
cs: &mut CS,
left: UInt8,
right: UInt8,
) -> Result<UInt8, IntegerError> {
Ok(left.div(
cs.ns(|| format!("enforce {} / {}", left.value.unwrap(), right.value.unwrap())),
&right,
)?)
}
pub(crate) fn enforce_u8_pow(
cs: &mut CS,
left: UInt8,
right: UInt8,
) -> Result<UInt8, IntegerError> {
Ok(left.pow(
cs.ns(|| {
format!(
"enforce {} ** {}",
left.value.unwrap(),
right.value.unwrap()
)
}),
&right,
)?)
}
}

View File

@ -15,7 +15,7 @@ use snarkos_models::{
curves::{Field, PrimeField},
gadgets::{
r1cs::ConstraintSystem,
utilities::{boolean::Boolean, eq::EqGadget, uint32::UInt32},
utilities::{boolean::Boolean, eq::EqGadget, uint::UInt32},
},
};
@ -414,7 +414,7 @@ impl<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>> Constraine
self.enforce_boolean_eq(cs, bool_1, bool_2)?
}
(ConstrainedValue::Integer(num_1), ConstrainedValue::Integer(num_2)) => {
Self::enforce_integer_eq(cs, num_1, num_2)?
num_1.enforce_equal(cs, &num_2)?
}
(ConstrainedValue::Field(fe_1), ConstrainedValue::Field(fe_2)) => {
fe_1.enforce_equal(cs, &fe_2)?

View File

@ -9,8 +9,8 @@ use crate::{
use snarkos_models::{
curves::{Field, PrimeField},
gadgets::utilities::{
boolean::Boolean, uint128::UInt128, uint16::UInt16, uint32::UInt32, uint64::UInt64,
uint8::UInt8,
boolean::Boolean,
uint::{UInt128, UInt16, UInt32, UInt64, UInt8},
},
};
use std::fmt;

View File

@ -14,7 +14,7 @@ use snarkos_models::{
boolean::Boolean,
eq::{ConditionalEqGadget, EqGadget},
select::CondSelectGadget,
uint8::UInt8,
uint::UInt8,
ToBitsGadget, ToBytesGadget,
},
},

View File

@ -16,7 +16,7 @@ use snarkos_models::{
boolean::Boolean,
eq::{ConditionalEqGadget, EqGadget},
select::CondSelectGadget,
uint8::UInt8,
uint::UInt8,
ToBitsGadget, ToBytesGadget,
},
},

View File

@ -4,8 +4,8 @@
use crate::Import;
use snarkos_models::gadgets::utilities::{
boolean::Boolean, uint128::UInt128, uint16::UInt16, uint32::UInt32, uint64::UInt64,
uint8::UInt8,
boolean::Boolean,
uint::{UInt128, UInt16, UInt32, UInt64, UInt8},
};
use std::collections::HashMap;

View File

@ -3,8 +3,8 @@
use crate::{ast, types, Import, ImportSymbol};
use snarkos_models::gadgets::utilities::{
boolean::Boolean, uint128::UInt128, uint16::UInt16, uint32::UInt32, uint64::UInt64,
uint8::UInt8,
boolean::Boolean,
uint::{UInt128, UInt16, UInt32, UInt64, UInt8},
};
use std::collections::HashMap;

View File

@ -4,7 +4,7 @@ use leo_compiler::{
ConstrainedValue, InputValue, Integer,
};
use snarkos_models::gadgets::utilities::uint32::UInt32;
use snarkos_models::gadgets::utilities::uint::UInt32;
const DIRECTORY_NAME: &str = "tests/array/";

View File

@ -8,7 +8,7 @@ use leo_compiler::{
Statement, Type,
};
use snarkos_models::gadgets::utilities::uint32::UInt32;
use snarkos_models::gadgets::utilities::uint::UInt32;
const DIRECTORY_NAME: &str = "tests/circuit/";

View File

@ -5,7 +5,7 @@ use leo_compiler::{
ConstrainedValue, InputValue,
};
use snarkos_models::gadgets::utilities::uint32::UInt32;
use snarkos_models::gadgets::utilities::uint::UInt32;
const DIRECTORY_NAME: &str = "tests/integer/u32/";

View File

@ -6,7 +6,7 @@ use leo_compiler::{
};
use snarkos_curves::edwards_bls12::Fq;
use snarkos_models::gadgets::{r1cs::TestConstraintSystem, utilities::uint32::UInt32};
use snarkos_models::gadgets::{r1cs::TestConstraintSystem, utilities::uint::UInt32};
const DIRECTORY_NAME: &str = "tests/mutability/";