Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
fr.hpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: Completed, auditors: [Federico], commit: }
3// external_1: { status: not started, auditors: [], commit: }
4// external_2: { status: not started, auditors: [], commit: }
5// =====================
6
7#pragma once
8
9#include <cstdint>
10#include <iomanip>
11#include <ostream>
12
13#include "../../fields/field.hpp"
15
16// NOLINTBEGIN(cppcoreguidelines-avoid-c-arrays)
17
18namespace bb {
19
30 public:
31 // A little-endian representation of the modulus split into 4 64-bit words
32 static constexpr uint64_t modulus_0 = 0x43E1F593F0000001UL;
33 static constexpr uint64_t modulus_1 = 0x2833E84879B97091UL;
34 static constexpr uint64_t modulus_2 = 0xB85045B68181585DUL;
35 static constexpr uint64_t modulus_3 = 0x30644E72E131A029UL;
36
37 // A little-endian representation of R^2 modulo the modulus (R=2^256 mod modulus) split into 4 64-bit words
38 static constexpr uint64_t r_squared_0 = 0x1BB8E645AE216DA7UL;
39 static constexpr uint64_t r_squared_1 = 0x53FE3AB1E35C59E3UL;
40 static constexpr uint64_t r_squared_2 = 0x8C49833D53BB8085UL;
41 static constexpr uint64_t r_squared_3 = 0x216D0B17F4E44A5UL;
42
43 // -(Modulus^-1) mod 2^64
44 // This constant is used during multiplication: given an 8-limb representation of the multiplication of two field
45 // elements, for each of the lowest four limbs we compute: k_i = r_inv * limb_i and we add 2^{64 * i} * k_i * p to
46 // the result of the multiplication. In this way we zero out the lowest four limbs of the multiplication and we can
47 // divide by 2^256 by taking the highest four limbs. See field_docs.hpp for more details.
48 static constexpr uint64_t r_inv = 0xc2e1f593efffffffUL;
49
50 // 2^(-64) mod Modulus
51 // Used in the reduction mechanism, see field_docs.md
52 // Instead of computing k, we multiply the lowest limb by this value and then add to the following 5 limbs.
53 // This saves us from having to compute k
54 static constexpr uint64_t r_inv_0 = 0x2d3e8053e396ee4dUL;
55 static constexpr uint64_t r_inv_1 = 0xca478dbeab3c92cdUL;
56 static constexpr uint64_t r_inv_2 = 0xb2d8f06f77f52a93UL;
57 static constexpr uint64_t r_inv_3 = 0x24d6ba07f7aa8f04UL;
58
59 // A little-endian representation of the cubic root of 1 in Fr in Montgomery form split into 4 64-bit words
60 static constexpr uint64_t cube_root_0 = 0x93e7cede4a0329b3UL;
61 static constexpr uint64_t cube_root_1 = 0x7d4fdca77a96c167UL;
62 static constexpr uint64_t cube_root_2 = 0x8be4ba08b19a750aUL;
63 static constexpr uint64_t cube_root_3 = 0x1cbd5653a5661c25UL;
64
65 // A little-endian representation of the primitive root of 1 in Fr split into 4 64-bit words in Montgomery form
66 // (R=2^256 mod modulus). This is a root of unity in a large power of 2 (order 28) subgroup of Fr.
67 static constexpr uint64_t primitive_root_0 = 0x636e735580d13d9cUL;
68 static constexpr uint64_t primitive_root_1 = 0xa22bf3742445ffd6UL;
69 static constexpr uint64_t primitive_root_2 = 0x56452ac01eb203d8UL;
70 static constexpr uint64_t primitive_root_3 = 0x1860ef942963f9e7UL;
71
72 // Coset generators in Montgomery form for R=2^256 mod Modulus. Used in FFT-based proving systems
73 static constexpr uint64_t coset_generator_0 = 0x5eef048d8fffffe7ULL;
74 static constexpr uint64_t coset_generator_1 = 0x12ee50ec1ce401d0ULL;
75 static constexpr uint64_t coset_generator_2 = 0x29312d5a5e5ee7ULL;
76 static constexpr uint64_t coset_generator_3 = 0x463456c802275bedULL;
77
78 // A little-endian representation of the modulus split into 9 29-bit limbs
79 // This is used in wasm because we can only do multiplication with 64-bit result instead of 128-bit like in x86_64
80 static constexpr uint64_t modulus_wasm_0 = 0x10000001;
81 static constexpr uint64_t modulus_wasm_1 = 0x1f0fac9f;
82 static constexpr uint64_t modulus_wasm_2 = 0xe5c2450;
83 static constexpr uint64_t modulus_wasm_3 = 0x7d090f3;
84 static constexpr uint64_t modulus_wasm_4 = 0x1585d283;
85 static constexpr uint64_t modulus_wasm_5 = 0x2db40c0;
86 static constexpr uint64_t modulus_wasm_6 = 0xa6e141;
87 static constexpr uint64_t modulus_wasm_7 = 0xe5c2634;
88 static constexpr uint64_t modulus_wasm_8 = 0x30644e;
89
90 // A little-endian representation of R^2 modulo the modulus (R=2^261 mod modulus) split into 4 64-bit words
91 // We use 2^261 in wasm, because 261=29*9, the 9 29-bit limbs used for arithmetic
92 static constexpr uint64_t r_squared_wasm_0 = 0x38c2e14b45b69bd4UL;
93 static constexpr uint64_t r_squared_wasm_1 = 0x0ffedb1885883377UL;
94 static constexpr uint64_t r_squared_wasm_2 = 0x7840f9f0abc6e54dUL;
95 static constexpr uint64_t r_squared_wasm_3 = 0x0a054a3e848b0f05UL;
96
97 // 2^(-29) mod Modulus
98 // Used in the reduction mechanism, see field_docs.md
99 // Instead of computing k, we multiply the lowest limb by this value and then add to the following 10 limbs.
100 // This saves us from having to compute k
101 static constexpr uint64_t r_inv_wasm_0 = 0x18f05361;
102 static constexpr uint64_t r_inv_wasm_1 = 0x12bb1fe;
103 static constexpr uint64_t r_inv_wasm_2 = 0xf5d8135;
104 static constexpr uint64_t r_inv_wasm_3 = 0x1e6275f6;
105 static constexpr uint64_t r_inv_wasm_4 = 0x7e7a880;
106 static constexpr uint64_t r_inv_wasm_5 = 0x10c6bf1f;
107 static constexpr uint64_t r_inv_wasm_6 = 0x11f74a6c;
108 static constexpr uint64_t r_inv_wasm_7 = 0x6fdaecb;
109 static constexpr uint64_t r_inv_wasm_8 = 0x183227;
110
111 // A little-endian representation of the cubic root of 1 in Fr in Montgomery form for wasm (R=2^261 mod modulus)
112 // split into 4 64-bit words
113 static constexpr uint64_t cube_root_wasm_0 = 0x7334a1ce7065364dUL;
114 static constexpr uint64_t cube_root_wasm_1 = 0xae21578e4a14d22aUL;
115 static constexpr uint64_t cube_root_wasm_2 = 0xcea2148a96b51265UL;
116 static constexpr uint64_t cube_root_wasm_3 = 0x0038f7edf614a198UL;
117
118 // A little-endian representation of the primitive root of 1 Fr in Montgomery form for wasm (R=2^261 mod modulus)
119 // split into 4 64-bit words
120 static constexpr uint64_t primitive_root_wasm_0 = 0x2faf11711a27b370UL;
121 static constexpr uint64_t primitive_root_wasm_1 = 0xc23fe9fced28f1b8UL;
122 static constexpr uint64_t primitive_root_wasm_2 = 0x43a0fc9bbe2af541UL;
123 static constexpr uint64_t primitive_root_wasm_3 = 0x05d90b5719653a4fUL;
124
125 // Coset generators in Montgomery form for R=2^261 mod Modulus. Used in FFT-based proving systems
126 static constexpr uint64_t coset_generator_wasm_0 = 0xab46711cdffffcb2ULL;
127 static constexpr uint64_t coset_generator_wasm_1 = 0x2476607dbd2dfff1ULL;
128 static constexpr uint64_t coset_generator_wasm_2 = 0xe6b99ee0068dfc25ULL;
129 static constexpr uint64_t coset_generator_wasm_3 = 0x1484c05bce00b620ULL;
130
131 // Parameters used for quickly splitting a scalar into two endomorphism scalars for faster scalar multiplication
132 // For specifics on how these have been derived, see ecc/fields/endomorphim_scalars.py
133 static constexpr uint64_t endo_g1_lo = 0x7a7bd9d4391eb18dUL;
134 static constexpr uint64_t endo_g1_mid = 0x4ccef014a773d2cfUL;
135 static constexpr uint64_t endo_g1_hi = 0x0000000000000002UL;
136 static constexpr uint64_t endo_g2_lo = 0xd91d232ec7e0b3d7UL;
137 static constexpr uint64_t endo_g2_mid = 0x0000000000000002UL;
138 static constexpr uint64_t endo_minus_b1_lo = 0x8211bbeb7d4f1128UL;
139 static constexpr uint64_t endo_minus_b1_mid = 0x6f4d8248eeb859fcUL;
140 static constexpr uint64_t endo_b2_lo = 0x89d3256894d213e3UL;
141 static constexpr uint64_t endo_b2_mid = 0UL;
142
143 // used in msgpack schema serialization
144 static constexpr char schema_name[] = "fr";
145 static constexpr bool has_high_2adicity = true;
146
147 // This is a BN254 scalar, so it represents one BN254 scalar
148 static constexpr size_t NUM_BN254_SCALARS = 1;
149 static constexpr size_t MAX_BITS_PER_ENDOMORPHISM_SCALAR = 128;
150
151 // A point in Fr is represented with 1 public input
152 static constexpr size_t PUBLIC_INPUTS_SIZE = FR_PUBLIC_INPUTS_SIZE;
153};
154
156
157template <> template <> inline fr fr::reconstruct_from_public(const std::span<const fr, PUBLIC_INPUTS_SIZE>& limbs)
158{
159 return fr(limbs[0]);
160}
161
162} // namespace bb
163
164// NOLINTEND(cppcoreguidelines-avoid-c-arrays)
Parameters defining the scalar field of the BN254 curve.
Definition fr.hpp:29
static constexpr uint64_t coset_generator_wasm_0
Definition fr.hpp:126
static constexpr uint64_t coset_generator_wasm_1
Definition fr.hpp:127
static constexpr uint64_t endo_b2_mid
Definition fr.hpp:141
static constexpr uint64_t coset_generator_wasm_2
Definition fr.hpp:128
static constexpr uint64_t r_inv_wasm_0
Definition fr.hpp:101
static constexpr uint64_t coset_generator_2
Definition fr.hpp:75
static constexpr uint64_t r_inv_2
Definition fr.hpp:56
static constexpr uint64_t modulus_wasm_8
Definition fr.hpp:88
static constexpr uint64_t primitive_root_1
Definition fr.hpp:68
static constexpr uint64_t r_inv
Definition fr.hpp:48
static constexpr uint64_t endo_g1_lo
Definition fr.hpp:133
static constexpr uint64_t modulus_wasm_3
Definition fr.hpp:83
static constexpr uint64_t r_inv_wasm_2
Definition fr.hpp:103
static constexpr uint64_t modulus_wasm_4
Definition fr.hpp:84
static constexpr uint64_t cube_root_wasm_0
Definition fr.hpp:113
static constexpr uint64_t endo_minus_b1_lo
Definition fr.hpp:138
static constexpr uint64_t cube_root_wasm_3
Definition fr.hpp:116
static constexpr uint64_t r_squared_wasm_3
Definition fr.hpp:95
static constexpr uint64_t endo_g2_mid
Definition fr.hpp:137
static constexpr uint64_t primitive_root_0
Definition fr.hpp:67
static constexpr uint64_t r_inv_wasm_7
Definition fr.hpp:108
static constexpr uint64_t primitive_root_2
Definition fr.hpp:69
static constexpr uint64_t coset_generator_3
Definition fr.hpp:76
static constexpr uint64_t r_squared_3
Definition fr.hpp:41
static constexpr uint64_t coset_generator_0
Definition fr.hpp:73
static constexpr uint64_t r_inv_wasm_8
Definition fr.hpp:109
static constexpr uint64_t modulus_0
Definition fr.hpp:32
static constexpr uint64_t r_squared_1
Definition fr.hpp:39
static constexpr size_t NUM_BN254_SCALARS
Definition fr.hpp:148
static constexpr uint64_t r_inv_wasm_6
Definition fr.hpp:107
static constexpr uint64_t cube_root_3
Definition fr.hpp:63
static constexpr uint64_t modulus_wasm_6
Definition fr.hpp:86
static constexpr uint64_t modulus_wasm_0
Definition fr.hpp:80
static constexpr uint64_t cube_root_1
Definition fr.hpp:61
static constexpr uint64_t r_squared_wasm_1
Definition fr.hpp:93
static constexpr size_t PUBLIC_INPUTS_SIZE
Definition fr.hpp:152
static constexpr uint64_t endo_b2_lo
Definition fr.hpp:140
static constexpr uint64_t r_inv_wasm_4
Definition fr.hpp:105
static constexpr bool has_high_2adicity
Definition fr.hpp:145
static constexpr uint64_t r_squared_0
Definition fr.hpp:38
static constexpr uint64_t primitive_root_wasm_2
Definition fr.hpp:122
static constexpr uint64_t r_squared_2
Definition fr.hpp:40
static constexpr uint64_t r_inv_1
Definition fr.hpp:55
static constexpr uint64_t cube_root_0
Definition fr.hpp:60
static constexpr uint64_t primitive_root_3
Definition fr.hpp:70
static constexpr uint64_t coset_generator_wasm_3
Definition fr.hpp:129
static constexpr uint64_t modulus_3
Definition fr.hpp:35
static constexpr uint64_t primitive_root_wasm_3
Definition fr.hpp:123
static constexpr uint64_t cube_root_wasm_1
Definition fr.hpp:114
static constexpr uint64_t endo_g2_lo
Definition fr.hpp:136
static constexpr uint64_t r_inv_0
Definition fr.hpp:54
static constexpr uint64_t modulus_wasm_5
Definition fr.hpp:85
static constexpr uint64_t primitive_root_wasm_1
Definition fr.hpp:121
static constexpr uint64_t r_inv_wasm_3
Definition fr.hpp:104
static constexpr uint64_t modulus_wasm_2
Definition fr.hpp:82
static constexpr uint64_t primitive_root_wasm_0
Definition fr.hpp:120
static constexpr uint64_t modulus_wasm_1
Definition fr.hpp:81
static constexpr uint64_t r_inv_wasm_1
Definition fr.hpp:102
static constexpr uint64_t cube_root_2
Definition fr.hpp:62
static constexpr uint64_t endo_minus_b1_mid
Definition fr.hpp:139
static constexpr uint64_t coset_generator_1
Definition fr.hpp:74
static constexpr uint64_t r_squared_wasm_0
Definition fr.hpp:92
static constexpr uint64_t r_squared_wasm_2
Definition fr.hpp:94
static constexpr uint64_t modulus_wasm_7
Definition fr.hpp:87
static constexpr uint64_t r_inv_3
Definition fr.hpp:57
static constexpr uint64_t endo_g1_mid
Definition fr.hpp:134
static constexpr uint64_t modulus_2
Definition fr.hpp:34
static constexpr uint64_t cube_root_wasm_2
Definition fr.hpp:115
static constexpr uint64_t endo_g1_hi
Definition fr.hpp:135
static constexpr size_t MAX_BITS_PER_ENDOMORPHISM_SCALAR
Definition fr.hpp:149
static constexpr uint64_t modulus_1
Definition fr.hpp:33
static constexpr uint64_t r_inv_wasm_5
Definition fr.hpp:106
static constexpr char schema_name[]
Definition fr.hpp:144
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
static field reconstruct_from_public(const std::span< const field< V >, PUBLIC_INPUTS_SIZE > &limbs)