pub mod curve_addition;
pub mod scalar_mul;
use crate::constraint_system::{TurboComposer, Witness};
use dusk_bls12_381::BlsScalar;
use dusk_jubjub::JubJubAffine;
#[derive(Debug, Clone, Copy)]
pub struct WitnessPoint {
x: Witness,
y: Witness,
}
impl WitnessPoint {
pub const fn x(&self) -> &Witness {
&self.x
}
pub const fn y(&self) -> &Witness {
&self.y
}
}
impl TurboComposer {
pub fn append_point<P: Into<JubJubAffine>>(
&mut self,
affine: P,
) -> WitnessPoint {
let affine = affine.into();
let x = self.append_witness(affine.get_x());
let y = self.append_witness(affine.get_y());
WitnessPoint { x, y }
}
pub fn append_public_point<P: Into<JubJubAffine>>(
&mut self,
affine: P,
) -> WitnessPoint {
let affine = affine.into();
let point = self.append_point(affine);
self.assert_equal_constant(
point.x,
BlsScalar::zero(),
Some(-affine.get_x()),
);
self.assert_equal_constant(
point.y,
BlsScalar::zero(),
Some(-affine.get_y()),
);
point
}
pub fn append_constant_point<P: Into<JubJubAffine>>(
&mut self,
affine: P,
) -> WitnessPoint {
let affine = affine.into();
let x = self.append_constant(affine.get_x());
let y = self.append_constant(affine.get_y());
WitnessPoint { x, y }
}
pub fn append_constant_identity(&mut self) -> WitnessPoint {
let x = Self::constant_zero();
let y = self.append_constant(BlsScalar::one());
WitnessPoint { x, y }
}
pub fn assert_equal_public_point<P: Into<JubJubAffine>>(
&mut self,
point: WitnessPoint,
public: P,
) {
let public = public.into();
self.assert_equal_constant(
point.x,
BlsScalar::zero(),
Some(-public.get_x()),
);
self.assert_equal_constant(
point.y,
BlsScalar::zero(),
Some(-public.get_y()),
);
}
pub fn assert_equal_point(&mut self, a: WitnessPoint, b: WitnessPoint) {
self.assert_equal(a.x, b.x);
self.assert_equal(b.y, b.y);
}
pub fn component_select_point(
&mut self,
a: WitnessPoint,
b: WitnessPoint,
bit: Witness,
) -> WitnessPoint {
debug_assert!(
self.witnesses[&bit] == BlsScalar::one()
|| self.witnesses[&bit] == BlsScalar::zero()
);
let x = self.component_select(bit, *a.x(), *b.x());
let y = self.component_select(bit, *a.y(), *b.y());
WitnessPoint { x, y }
}
pub fn component_select_identity(
&mut self,
bit: Witness,
a: WitnessPoint,
) -> WitnessPoint {
debug_assert!(
self.witnesses[&bit] == BlsScalar::one()
|| self.witnesses[&bit] == BlsScalar::zero()
);
let x = self.component_select_zero(bit, *a.x());
let y = self.component_select_one(bit, *a.y());
WitnessPoint { x, y }
}
}
#[cfg(feature = "std")]
#[cfg(test)]
mod tests {
use super::*;
use crate::constraint_system::helper::*;
#[test]
fn test_component_select_point() {
let res = gadget_tester(
|composer| {
let bit_1 = composer.append_witness(BlsScalar::one());
let bit_0 = TurboComposer::constant_zero();
let point_a = composer.append_constant_identity();
let point_b = WitnessPoint {
x: composer.append_witness(BlsScalar::from(10u64)),
y: composer.append_witness(BlsScalar::from(20u64)),
};
let choice =
composer.component_select_point(point_a, point_b, bit_1);
composer.assert_equal_point(point_a, choice);
let choice =
composer.component_select_point(point_a, point_b, bit_0);
composer.assert_equal_point(point_b, choice);
},
32,
);
assert!(res.is_ok());
}
}