//! This module defines various traits required by the users of the library to implement. use bellperson::{gadgets::num::AllocatedNum, ConstraintSystem, SynthesisError}; use core::{ borrow::Borrow, fmt::Debug, ops::{Add, AddAssign, Mul, MulAssign, Neg, Sub, SubAssign}, }; use merlin::Transcript; use rand::{CryptoRng, RngCore}; use rug::Integer; /// Represents an element of a prime field pub trait PrimeField: Sized + Eq + Copy + Clone + Default + Send + Sync + Debug + Add + Sub + Mul + Neg + for<'a> Add<&'a Self, Output = Self> + for<'a> Mul<&'a Self, Output = Self> + for<'a> Sub<&'a Self, Output = Self> + AddAssign + MulAssign + SubAssign + for<'a> AddAssign<&'a Self> + for<'a> MulAssign<&'a Self> + for<'a> SubAssign<&'a Self> { /// returns the additive identity of the field fn zero() -> Self; /// returns the multiplicative identity of the field fn one() -> Self; /// converts the supplied bytes into an element of the field fn from_bytes_mod_order_wide(bytes: &[u8]) -> Option; /// returns an uniformly random element from the finite field fn random(rng: &mut (impl RngCore + CryptoRng)) -> Self; /// Get prime field order as a rug::Integer fn get_order() -> Integer; } /// Represents an element of a group pub trait Group: Clone + Copy + Debug + Eq + Sized + GroupOps + GroupOpsOwned + ScalarMul<::Scalar> + ScalarMulOwned<::Scalar> { /// A type representing an element of the base field of the group type Base: PrimeField; /// A type representing an element of the scalar field of the group type Scalar: PrimeField + ChallengeTrait; /// A type representing the compressed version of the group element type CompressedGroupElement: CompressedGroup; /// A method to compute a multiexponentation fn vartime_multiscalar_mul(scalars: I, points: J) -> Self where I: IntoIterator, I::Item: Borrow, J: IntoIterator, J::Item: Borrow, Self: Clone; /// Compresses the group element fn compress(&self) -> Self::CompressedGroupElement; /// Attempts to create a group element from a sequence of bytes, /// failing with a `None` if the supplied bytes do not encode the group element fn from_uniform_bytes(bytes: &[u8]) -> Option; /// Returns the affine coordinates (x, y, infinty) for the point fn to_coordinates(&self) -> (Self::Base, Self::Base, bool); } /// Represents a compressed version of a group element pub trait CompressedGroup: Clone + Copy + Debug + Eq + Sized + Send + Sync + 'static { /// A type that holds the decompressed version of the compressed group element type GroupElement: Group; /// Decompresses the compressed group element fn decompress(&self) -> Option; /// Returns a byte array representing the compressed group element fn as_bytes(&self) -> &[u8]; } /// A helper trait to generate challenges using a transcript object pub trait ChallengeTrait { /// Returns a Scalar representing the challenge using the transcript fn challenge(label: &'static [u8], transcript: &mut Transcript) -> Self; } /// A helper trait for types with a group operation. pub trait GroupOps: Add + Sub + AddAssign + SubAssign { } impl GroupOps for T where T: Add + Sub + AddAssign + SubAssign { } /// A helper trait for references with a group operation. pub trait GroupOpsOwned: for<'r> GroupOps<&'r Rhs, Output> {} impl GroupOpsOwned for T where T: for<'r> GroupOps<&'r Rhs, Output> {} /// A helper trait for types implementing group scalar multiplication. pub trait ScalarMul: Mul + MulAssign {} impl ScalarMul for T where T: Mul + MulAssign {} /// A helper trait for references implementing group scalar multiplication. pub trait ScalarMulOwned: for<'r> ScalarMul<&'r Rhs, Output> {} impl ScalarMulOwned for T where T: for<'r> ScalarMul<&'r Rhs, Output> {} /// A helper trait for a step of the incremental computation (i.e., circuit for F) pub trait StepCircuit { /// Sythesize the circuit for a computation step and return variable /// that corresponds to the output of the step z_{i+1} fn synthesize>( &self, cs: &mut CS, z: AllocatedNum, ) -> Result, SynthesisError>; }