mirror of
https://github.com/ProvableHQ/leo.git
synced 2024-11-24 16:08:55 +03:00
commit
3e9b963d5b
@ -8,7 +8,7 @@ use snarkos_curves::{
|
||||
use snarkos_errors::gadgets::SynthesisError;
|
||||
use snarkos_gadgets::curves::edwards_bls12::EdwardsBlsGadget;
|
||||
use snarkos_models::{
|
||||
curves::AffineCurve,
|
||||
curves::{AffineCurve, One, TEModelParameters},
|
||||
gadgets::{
|
||||
curves::{FieldGadget, FpGadget, GroupGadget},
|
||||
r1cs::ConstraintSystem,
|
||||
@ -33,6 +33,11 @@ pub enum EdwardsGroupType {
|
||||
|
||||
impl GroupType<Fq> for EdwardsGroupType {
|
||||
fn constant(string: String, span: Span) -> Result<Self, GroupError> {
|
||||
// 1group = generator
|
||||
if string.eq("1") {
|
||||
return Ok(Self::one());
|
||||
}
|
||||
|
||||
let value =
|
||||
Self::edwards_affine_from_str(string.clone()).map_err(|_| GroupError::invalid_group(string, span))?;
|
||||
|
||||
@ -104,7 +109,7 @@ impl GroupType<Fq> for EdwardsGroupType {
|
||||
|
||||
impl EdwardsGroupType {
|
||||
pub fn edwards_affine_from_str(string: String) -> Result<EdwardsAffine, SynthesisError> {
|
||||
// 0 or (0, 1)
|
||||
// x or (x, y)
|
||||
match Fq::from_str(&string).ok() {
|
||||
Some(x) => EdwardsAffine::get_point_from_x(x, false).ok_or(SynthesisError::AssignmentMissing),
|
||||
None => EdwardsAffine::from_str(&string).map_err(|_| SynthesisError::AssignmentMissing),
|
||||
@ -122,7 +127,12 @@ impl EdwardsGroupType {
|
||||
_ => Err(SynthesisError::AssignmentMissing),
|
||||
}?;
|
||||
|
||||
Self::edwards_affine_from_str(affine_string)
|
||||
// 1group = generator
|
||||
if affine_string.eq("1") {
|
||||
Ok(edwards_affine_one())
|
||||
} else {
|
||||
Self::edwards_affine_from_str(affine_string)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn allocated<CS: ConstraintSystem<Fq>>(&self, mut cs: CS) -> Result<EdwardsBlsGadget, SynthesisError> {
|
||||
@ -317,6 +327,24 @@ impl ToBytesGadget<Fq> for EdwardsGroupType {
|
||||
}
|
||||
}
|
||||
|
||||
fn edwards_affine_one() -> GroupAffine<EdwardsParameters> {
|
||||
let (x, y) = EdwardsParameters::AFFINE_GENERATOR_COEFFS;
|
||||
|
||||
EdwardsAffine::new(x, y)
|
||||
}
|
||||
|
||||
impl One for EdwardsGroupType {
|
||||
fn one() -> Self {
|
||||
let one = edwards_affine_one();
|
||||
|
||||
Self::Constant(one)
|
||||
}
|
||||
|
||||
fn is_one(&self) -> bool {
|
||||
self.eq(&Self::one())
|
||||
}
|
||||
}
|
||||
|
||||
impl std::fmt::Display for EdwardsGroupType {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||
match self {
|
||||
|
@ -4,7 +4,7 @@ use crate::errors::GroupError;
|
||||
use leo_types::Span;
|
||||
|
||||
use snarkos_models::{
|
||||
curves::Field,
|
||||
curves::{Field, One},
|
||||
gadgets::{
|
||||
r1cs::ConstraintSystem,
|
||||
utilities::{
|
||||
@ -25,6 +25,7 @@ pub trait GroupType<F: Field>:
|
||||
+ Clone
|
||||
+ Debug
|
||||
+ Display
|
||||
+ One
|
||||
+ EvaluateEqGadget<F>
|
||||
+ EqGadget<F>
|
||||
+ ConditionalEqGadget<F>
|
||||
|
@ -9,10 +9,10 @@ use crate::{
|
||||
use leo_compiler::{group::edwards_bls12::EdwardsGroupType, ConstrainedValue};
|
||||
use leo_types::InputValue;
|
||||
|
||||
use snarkos_curves::edwards_bls12::{EdwardsAffine, Fq};
|
||||
use snarkos_curves::edwards_bls12::{EdwardsAffine, EdwardsParameters, Fq};
|
||||
use snarkos_gadgets::curves::edwards_bls12::EdwardsBlsGadget;
|
||||
use snarkos_models::{
|
||||
curves::Zero,
|
||||
curves::{TEModelParameters, Zero},
|
||||
gadgets::{r1cs::TestConstraintSystem, utilities::alloc::AllocGadget},
|
||||
};
|
||||
use std::str::FromStr;
|
||||
@ -47,6 +47,13 @@ fn output_zero(program: EdwardsTestCompiler) {
|
||||
output_expected_constant(program, EdwardsAffine::zero())
|
||||
}
|
||||
|
||||
fn output_one(program: EdwardsTestCompiler) {
|
||||
let (x, y) = EdwardsParameters::AFFINE_GENERATOR_COEFFS;
|
||||
let one = EdwardsAffine::new(x, y);
|
||||
|
||||
output_expected_constant(program, one)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_zero() {
|
||||
let bytes = include_bytes!("zero.leo");
|
||||
@ -55,6 +62,14 @@ fn test_zero() {
|
||||
output_zero(program);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_one() {
|
||||
let bytes = include_bytes!("one.leo");
|
||||
let program = parse_program(bytes).unwrap();
|
||||
|
||||
output_one(program)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_point() {
|
||||
let point = EdwardsAffine::from_str(TEST_POINT_1).unwrap();
|
||||
|
3
compiler/tests/group/one.leo
Normal file
3
compiler/tests/group/one.leo
Normal file
@ -0,0 +1,3 @@
|
||||
function main() -> group {
|
||||
return 1group
|
||||
}
|
@ -19,7 +19,7 @@ circuit PedersenHash {
|
||||
|
||||
// The 'pedersen_hash' main function.
|
||||
function main() -> group {
|
||||
const parameters = [0group; 256];
|
||||
const parameters = [1group; 256];
|
||||
const pedersen = PedersenHash::new(parameters);
|
||||
let input: bool[256] = [true; 256];
|
||||
return pedersen.hash(input)
|
||||
|
Loading…
Reference in New Issue
Block a user