Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
bb::group_elements::element< Fq, Fr, Params > Class Template Reference

element class. Implements ecc group arithmetic using Jacobian coordinates See https://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l More...

#include <element.hpp>

Public Member Functions

 element () noexcept=default
 
constexpr element (const Fq &a, const Fq &b, const Fq &c) noexcept
 
constexpr element (const element &other) noexcept
 
constexpr element (element &&other) noexcept
 
constexpr element (const affine_element< Fq, Fr, Params > &other) noexcept
 
 ~element () noexcept=default
 
constexpr elementoperator= (const element &other) noexcept
 
constexpr elementoperator= (element &&other) noexcept
 
constexpr operator affine_element< Fq, Fr, Params > () const noexcept
 
constexpr element dbl () const noexcept
 
constexpr void self_dbl () noexcept
 
constexpr void self_mixed_add_or_sub (const affine_element< Fq, Fr, Params > &other, uint64_t predicate) noexcept
 
constexpr element operator+ (const element &other) const noexcept
 
constexpr element operator+ (const affine_element< Fq, Fr, Params > &other) const noexcept
 
constexpr element operator+= (const element &other) noexcept
 
constexpr element operator+= (const affine_element< Fq, Fr, Params > &other) noexcept
 
constexpr element operator- (const element &other) const noexcept
 
constexpr element operator- (const affine_element< Fq, Fr, Params > &other) const noexcept
 
constexpr element operator- () const noexcept
 
constexpr element operator-= (const element &other) noexcept
 
constexpr element operator-= (const affine_element< Fq, Fr, Params > &other) noexcept
 
element operator* (const Fr &exponent) const noexcept
 
element operator*= (const Fr &exponent) noexcept
 
constexpr element normalize () const noexcept
 
BB_INLINE constexpr element set_infinity () const noexcept
 
BB_INLINE constexpr void self_set_infinity () noexcept
 
BB_INLINE constexpr bool is_point_at_infinity () const noexcept
 
BB_INLINE constexpr bool on_curve () const noexcept
 
BB_INLINE constexpr bool operator== (const element &other) const noexcept
 
template<typename >
element< Fq, Fr, T > random_coordinates_on_curve (numeric::RNG *engine) noexcept
 

Static Public Member Functions

static constexpr element one () noexcept
 
static constexpr element zero () noexcept
 
static element random_element (numeric::RNG *engine=nullptr) noexcept
 
static element infinity ()
 
static void batch_normalize (element *elements, size_t num_elements) noexcept
 
static void batch_affine_add (const std::span< affine_element< Fq, Fr, Params > > &first_group, const std::span< affine_element< Fq, Fr, Params > > &second_group, const std::span< affine_element< Fq, Fr, Params > > &results) noexcept
 Pairwise affine add points in first and second group.
 
static std::vector< affine_element< Fq, Fr, Params > > batch_mul_with_endomorphism (const std::span< const affine_element< Fq, Fr, Params > > &points, const Fr &scalar) noexcept
 Multiply each point by the same scalar.
 

Public Attributes

Fq x
 
Fq y
 
Fq z
 

Static Public Attributes

static constexpr Fq curve_b = Params::b
 

Private Member Functions

element mul_without_endomorphism (const Fr &scalar) const noexcept
 
element mul_with_endomorphism (const Fr &scalar) const noexcept
 

Static Private Member Functions

template<typename = typename std::enable_if<Params::can_hash_to_curve>>
static element random_coordinates_on_curve (numeric::RNG *engine=nullptr) noexcept
 
static void conditional_negate_affine (const affine_element< Fq, Fr, Params > &in, affine_element< Fq, Fr, Params > &out, uint64_t predicate) noexcept
 

Friends

class TestElementPrivate
 
constexpr element operator+ (const affine_element< Fq, Fr, Params > &left, const element &right) noexcept
 
constexpr element operator- (const affine_element< Fq, Fr, Params > &left, const element &right) noexcept
 
std::ostream & operator<< (std::ostream &os, const element &a)
 

Detailed Description

template<class Fq, class Fr, class Params>
class bb::group_elements::element< Fq, Fr, Params >

element class. Implements ecc group arithmetic using Jacobian coordinates See https://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l

Note: Currently subgroup checks are NOT IMPLEMENTED Our current implementation uses G1 points that have a cofactor of 1. All G2 points are precomputed (generator [1]_2 and trusted setup point [x]_2). Explicitly assume precomputed points are valid members of the prime-order subgroup for G2.

Template Parameters
Fqprime field the curve is defined over
Frprime field whose characteristic equals the size of the prime-order elliptic curve subgroup
Paramscurve parameters

Definition at line 33 of file element.hpp.

Constructor & Destructor Documentation

◆ element() [1/5]

template<class Fq , class Fr , class Params >
bb::group_elements::element< Fq, Fr, Params >::element ( )
defaultnoexcept

◆ element() [2/5]

template<class Fq , class Fr , class T >
constexpr bb::group_elements::element< Fq, Fr, T >::element ( const Fq a,
const Fq b,
const Fq c 
)
constexprnoexcept

Definition at line 18 of file element_impl.hpp.

◆ element() [3/5]

template<class Fq , class Fr , class T >
constexpr bb::group_elements::element< Fq, Fr, T >::element ( const element< Fq, Fr, Params > &  other)
constexprnoexcept

Definition at line 25 of file element_impl.hpp.

◆ element() [4/5]

template<class Fq , class Fr , class T >
constexpr bb::group_elements::element< Fq, Fr, T >::element ( element< Fq, Fr, Params > &&  other)
constexprnoexcept

Definition at line 32 of file element_impl.hpp.

◆ element() [5/5]

template<class Fq , class Fr , class Params >
constexpr bb::group_elements::element< Fq, Fr, Params >::element ( const affine_element< Fq, Fr, Params > &  other)
constexprnoexcept

◆ ~element()

template<class Fq , class Fr , class Params >
bb::group_elements::element< Fq, Fr, Params >::~element ( )
defaultnoexcept

Member Function Documentation

◆ batch_affine_add()

template<class Fq , class Fr , class Params >
void bb::group_elements::element< Fq, Fr, T >::batch_affine_add ( const std::span< affine_element< Fq, Fr, Params > > &  first_group,
const std::span< affine_element< Fq, Fr, Params > > &  second_group,
const std::span< affine_element< Fq, Fr, Params > > &  results 
)
staticnoexcept

Pairwise affine add points in first and second group.

Parameters
first_group
second_group
results

Perform point addition rhs[i]=rhs[i]+lhs[i] with batch inversion

Perform batch affine addition in parallel

Definition at line 722 of file element_impl.hpp.

◆ batch_mul_with_endomorphism()

template<class Fq , class Fr , class Params >
std::vector< affine_element< Fq, Fr, T > > bb::group_elements::element< Fq, Fr, T >::batch_mul_with_endomorphism ( const std::span< const affine_element< Fq, Fr, Params > > &  points,
const Fr scalar 
)
staticnoexcept

Multiply each point by the same scalar.

We use the fact that all points are being multiplied by the same scalar to batch the operations (perform batch affine additions and doublings with batch inversion trick)

Parameters
pointsThe span of individual points that need to be scaled
scalarThe scalar we multiply all the points by
Returns
std::vector<affine_element<Fq, Fr, T>> Vector of new points where each point is exponentâ‹…points[i]

Perform point addition rhs[i]=rhs[i]+lhs[i] with batch inversion

Perform batch affine addition in parallel

Perform point doubling lhs[i]=lhs[i]+lhs[i] with batch inversion

Perform point doubling in parallel

Definition at line 794 of file element_impl.hpp.

◆ batch_normalize()

template<typename Fq , typename Fr , typename T >
void bb::group_elements::element< Fq, Fr, T >::batch_normalize ( element< Fq, Fr, Params > *  elements,
size_t  num_elements 
)
staticnoexcept

We now proceed to iterate back down the array of points. At each iteration we update the accumulator to contain the z-coordinate of the currently worked-upon z-coordinate. We can then multiply this accumulator with temporaries, to get a scalar that is equal to the inverse of the z-coordinate of the point at the next iteration cycle e.g. Imagine we have 4 points, such that:

accumulator = 1 / z.data[0]*z.data[1]*z.data[2]*z.data[3] temporaries[3] = z.data[0]*z.data[1]*z.data[2] temporaries[2] = z.data[0]*z.data[1] temporaries[1] = z.data[0] temporaries[0] = 1

At the first iteration, accumulator * temporaries[3] = z.data[0]*z.data[1]*z.data[2] / z.data[0]*z.data[1]*z.data[2]*z.data[3] = (1 / z.data[3]) We then update accumulator, such that:

accumulator = accumulator * z.data[3] = 1 / z.data[0]*z.data[1]*z.data[2]

At the second iteration, accumulator * temporaries[2] = z.data[0]*z.data[1] / z.data[0]*z.data[1]*z.data[2] = (1 z.data[2]) And so on, until we have computed every z-inverse!

We can then convert out of Jacobian form (x = X / Z^2, y = Y / Z^3) with 4 muls and 1 square.

Definition at line 1044 of file element_impl.hpp.

◆ conditional_negate_affine()

template<class Fq , class Fr , class Params >
void bb::group_elements::element< Fq, Fr, T >::conditional_negate_affine ( const affine_element< Fq, Fr, Params > &  in,
affine_element< Fq, Fr, Params > &  out,
uint64_t  predicate 
)
staticprivatenoexcept

Definition at line 1036 of file element_impl.hpp.

◆ dbl()

template<class Fq , class Fr , class T >
constexpr element< Fq, Fr, T > bb::group_elements::element< Fq, Fr, T >::dbl ( ) const
constexprnoexcept

Definition at line 151 of file element_impl.hpp.

◆ infinity()

template<class Fq , class Fr , class T >
element< Fq, Fr, T > bb::group_elements::element< Fq, Fr, T >::infinity ( )
static

Definition at line 497 of file element_impl.hpp.

◆ is_point_at_infinity()

template<class Fq , class Fr , class T >
constexpr bool bb::group_elements::element< Fq, Fr, T >::is_point_at_infinity ( ) const
constexprnoexcept

Definition at line 527 of file element_impl.hpp.

◆ mul_with_endomorphism()

template<class Fq , class Fr , class T >
element< Fq, Fr, T > bb::group_elements::element< Fq, Fr, T >::mul_with_endomorphism ( const Fr scalar) const
privatenoexcept

Definition at line 658 of file element_impl.hpp.

◆ mul_without_endomorphism()

template<class Fq , class Fr , class T >
element< Fq, Fr, T > bb::group_elements::element< Fq, Fr, T >::mul_without_endomorphism ( const Fr scalar) const
privatenoexcept

Definition at line 603 of file element_impl.hpp.

◆ normalize()

template<class Fq , class Fr , class T >
constexpr element< Fq, Fr, T > bb::group_elements::element< Fq, Fr, T >::normalize ( ) const
constexprnoexcept

Definition at line 491 of file element_impl.hpp.

◆ on_curve()

template<class Fq , class Fr , class T >
constexpr bool bb::group_elements::element< Fq, Fr, T >::on_curve ( ) const
constexprnoexcept

Definition at line 538 of file element_impl.hpp.

◆ one()

template<class Fq , class Fr , class Params >
static constexpr element bb::group_elements::element< Fq, Fr, Params >::one ( )
inlinestaticconstexprnoexcept

Definition at line 45 of file element.hpp.

◆ operator affine_element< Fq, Fr, Params >()

template<class Fq , class Fr , class Params >
constexpr bb::group_elements::element< Fq, Fr, Params >::operator affine_element< Fq, Fr, Params > ( ) const
constexprnoexcept

◆ operator*()

template<class Fq , class Fr , class T >
element< Fq, Fr, T > bb::group_elements::element< Fq, Fr, T >::operator* ( const Fr exponent) const
noexcept

Definition at line 477 of file element_impl.hpp.

◆ operator*=()

template<class Fq , class Fr , class T >
element< Fq, Fr, T > bb::group_elements::element< Fq, Fr, T >::operator*= ( const Fr exponent)
noexcept

Definition at line 485 of file element_impl.hpp.

◆ operator+() [1/2]

template<class Fq , class Fr , class Params >
constexpr element bb::group_elements::element< Fq, Fr, Params >::operator+ ( const affine_element< Fq, Fr, Params > &  other) const
constexprnoexcept

◆ operator+() [2/2]

template<class Fq , class Fr , class T >
constexpr element< Fq, Fr, T > bb::group_elements::element< Fq, Fr, T >::operator+ ( const element< Fq, Fr, Params > &  other) const
constexprnoexcept

Definition at line 451 of file element_impl.hpp.

◆ operator+=() [1/2]

template<class Fq , class Fr , class Params >
constexpr element bb::group_elements::element< Fq, Fr, Params >::operator+= ( const affine_element< Fq, Fr, Params > &  other)
constexprnoexcept

◆ operator+=() [2/2]

template<class Fq , class Fr , class T >
constexpr element< Fq, Fr, T > bb::group_elements::element< Fq, Fr, T >::operator+= ( const element< Fq, Fr, Params > &  other)
constexprnoexcept

Definition at line 362 of file element_impl.hpp.

◆ operator-() [1/3]

template<class Fq , class Fr , class T >
constexpr element< Fq, Fr, T > bb::group_elements::element< Fq, Fr, T >::operator- ( ) const
constexprnoexcept

Definition at line 471 of file element_impl.hpp.

◆ operator-() [2/3]

template<class Fq , class Fr , class Params >
constexpr element bb::group_elements::element< Fq, Fr, Params >::operator- ( const affine_element< Fq, Fr, Params > &  other) const
constexprnoexcept

◆ operator-() [3/3]

template<class Fq , class Fr , class T >
constexpr element< Fq, Fr, T > bb::group_elements::element< Fq, Fr, T >::operator- ( const element< Fq, Fr, Params > &  other) const
constexprnoexcept

Definition at line 465 of file element_impl.hpp.

◆ operator-=() [1/2]

template<class Fq , class Fr , class Params >
constexpr element bb::group_elements::element< Fq, Fr, Params >::operator-= ( const affine_element< Fq, Fr, Params > &  other)
constexprnoexcept

◆ operator-=() [2/2]

template<class Fq , class Fr , class T >
constexpr element< Fq, Fr, T > bb::group_elements::element< Fq, Fr, T >::operator-= ( const element< Fq, Fr, Params > &  other)
constexprnoexcept

Definition at line 458 of file element_impl.hpp.

◆ operator=() [1/2]

template<class Fq , class Fr , class T >
constexpr element< Fq, Fr, T > & bb::group_elements::element< Fq, Fr, T >::operator= ( const element< Fq, Fr, Params > &  other)
constexprnoexcept

Definition at line 46 of file element_impl.hpp.

◆ operator=() [2/2]

template<class Fq , class Fr , class T >
constexpr element< Fq, Fr, T > & bb::group_elements::element< Fq, Fr, T >::operator= ( element< Fq, Fr, Params > &&  other)
constexprnoexcept

Definition at line 58 of file element_impl.hpp.

◆ operator==()

template<class Fq , class Fr , class T >
constexpr bool bb::group_elements::element< Fq, Fr, T >::operator== ( const element< Fq, Fr, Params > &  other) const
constexprnoexcept

Definition at line 559 of file element_impl.hpp.

◆ random_coordinates_on_curve() [1/2]

template<class Fq , class Fr , class Params >
template<typename >
element< Fq, Fr, T > bb::group_elements::element< Fq, Fr, Params >::random_coordinates_on_curve ( numeric::RNG engine)
noexcept

Definition at line 1098 of file element_impl.hpp.

◆ random_coordinates_on_curve() [2/2]

template<class Fq , class Fr , class Params >
template<typename = typename std::enable_if<Params::can_hash_to_curve>>
static element bb::group_elements::element< Fq, Fr, Params >::random_coordinates_on_curve ( numeric::RNG engine = nullptr)
staticprivatenoexcept

◆ random_element()

template<class Fq , class Fr , class T >
element< Fq, Fr, T > bb::group_elements::element< Fq, Fr, T >::random_element ( numeric::RNG engine = nullptr)
staticnoexcept

Definition at line 586 of file element_impl.hpp.

◆ self_dbl()

template<class Fq , class Fr , class T >
constexpr void bb::group_elements::element< Fq, Fr, T >::self_dbl ( )
constexprnoexcept

Definition at line 82 of file element_impl.hpp.

◆ self_mixed_add_or_sub()

template<class Fq , class Fr , class Params >
constexpr void bb::group_elements::element< Fq, Fr, T >::self_mixed_add_or_sub ( const affine_element< Fq, Fr, Params > &  other,
uint64_t  predicate 
)
constexprnoexcept

Definition at line 159 of file element_impl.hpp.

◆ self_set_infinity()

template<class Fq , class Fr , class T >
constexpr void bb::group_elements::element< Fq, Fr, T >::self_set_infinity ( )
constexprnoexcept

Definition at line 511 of file element_impl.hpp.

◆ set_infinity()

template<class Fq , class Fr , class T >
constexpr element< Fq, Fr, T > bb::group_elements::element< Fq, Fr, T >::set_infinity ( ) const
constexprnoexcept

Definition at line 504 of file element_impl.hpp.

◆ zero()

template<class Fq , class Fr , class Params >
static constexpr element bb::group_elements::element< Fq, Fr, Params >::zero ( )
inlinestaticconstexprnoexcept

Definition at line 46 of file element.hpp.

Friends And Related Symbol Documentation

◆ operator+

template<class Fq , class Fr , class Params >
constexpr element operator+ ( const affine_element< Fq, Fr, Params > &  left,
const element< Fq, Fr, Params > &  right 
)
friend

Definition at line 75 of file element.hpp.

◆ operator-

template<class Fq , class Fr , class Params >
constexpr element operator- ( const affine_element< Fq, Fr, Params > &  left,
const element< Fq, Fr, Params > &  right 
)
friend

Definition at line 79 of file element.hpp.

◆ operator<<

template<class Fq , class Fr , class Params >
std::ostream & operator<< ( std::ostream &  os,
const element< Fq, Fr, Params > &  a 
)
friend

Definition at line 144 of file element.hpp.

◆ TestElementPrivate

template<class Fq , class Fr , class Params >
friend class TestElementPrivate
friend

Definition at line 112 of file element.hpp.

Member Data Documentation

◆ curve_b

template<class Fq , class Fr , class Params >
constexpr Fq bb::group_elements::element< Fq, Fr, Params >::curve_b = Params::b
staticconstexpr

Definition at line 35 of file element.hpp.

◆ x

template<class Fq , class Fr , class Params >
Fq bb::group_elements::element< Fq, Fr, Params >::x

Definition at line 106 of file element.hpp.

◆ y

template<class Fq , class Fr , class Params >
Fq bb::group_elements::element< Fq, Fr, Params >::y

Definition at line 107 of file element.hpp.

◆ z

template<class Fq , class Fr , class Params >
Fq bb::group_elements::element< Fq, Fr, Params >::z

Definition at line 108 of file element.hpp.


The documentation for this class was generated from the following files: