98 if (consumed_srs >
srs->get_monomial_size()) {
101 " points with an SRS of size ",
102 srs->get_monomial_size()));
105 G1 r = scalar_multiplication::pippenger_unsafe<Curve>(polynomial, point_table);
117 size_t max_batch_size = std::numeric_limits<size_t>::max())
const
124 std::vector<Commitment> commitments;
126 for (
size_t i = 0; i < polynomials.size();) {
128 size_t batch_size = std::min(max_batch_size, polynomials.size() - i);
129 size_t batch_end = i + batch_size;
135 for (
auto& polynomial : polynomials.subspan(i, batch_end - i)) {
137 size_t consumed_srs = polynomial.start_index() + polynomial.size();
138 if (consumed_srs >
srs->get_monomial_size()) {
141 " points with an SRS of size ",
142 srs->get_monomial_size()));
144 scalar_spans.emplace_back(polynomial.coeffs());
145 points_spans.emplace_back(point_table);
150 for (
const auto& result : results) {
151 commitments.emplace_back(result);
164 size_t max_batch_size = std::numeric_limits<size_t>::max())
167 for (
size_t i = 0; i < commitments.size(); ++i) {
168 transcript->send_to_verifier(
labels[i], commitments[i]);
179 wires.push_back(poly);
202 size_t final_active_wire_idx = 0)
209 constexpr size_t NONZERO_THRESHOLD = 75;
212 size_t total_num_scalars = 0;
213 for (
const auto& [first, second] : active_ranges) {
214 total_num_scalars += second - first;
218 size_t polynomial_size = final_active_wire_idx != 0 ? final_active_wire_idx : polynomial.
size();
219 size_t percentage_nonzero = total_num_scalars * 100 / polynomial_size;
220 if (percentage_nonzero > NONZERO_THRESHOLD) {
221 return commit(polynomial);
226 std::span<G1> point_table =
srs->get_monomial_points();
228 std::vector<Fr> scalars;
229 scalars.reserve(total_num_scalars);
231 points.reserve(total_num_scalars);
232 for (
const auto& [first, second] : active_ranges) {
233 auto poly_start = &polynomial[first];
238 scalars.insert(scalars.end(), poly_start, poly_end);
240 auto pts_start = &point_table[first];
241 auto pts_end = &point_table[second];
242 points.insert(points.end(), pts_start, pts_end);
246 G1 r = scalar_multiplication::pippenger_unsafe<Curve>({ 0, scalars }, points);
264 size_t final_active_wire_idx = 0)
266 BB_BENCH_NAME(
"CommitmentKey::commit_structured_with_nonzero_complement");
272 constexpr size_t CONSTANT_THRESHOLD = 50;
279 size_t total_num_complement_scalars = 0;
280 for (
size_t i = 0; i < active_ranges.size() - 1; ++i) {
281 const size_t start = active_ranges[i].second;
282 const size_t end = active_ranges[i + 1].first;
284 active_ranges_complement.emplace_back(start, end);
285 total_num_complement_scalars += end - start;
289 size_t polynomial_size = final_active_wire_idx != 0 ? final_active_wire_idx : polynomial.
size();
291 size_t percentage_constant = total_num_complement_scalars * 100 / polynomial_size;
293 if (percentage_constant < CONSTANT_THRESHOLD) {
294 return commit(polynomial);
299 std::span<G1> point_table =
srs->get_monomial_points();
306 points.reserve(total_num_complement_scalars);
307 for (
const auto& [start, end] : active_ranges_complement) {
308 for (
size_t i = start; i < end; i++) {
309 points.emplace_back(point_table[i]);
315 std::vector<Fr> unique_scalars;
316 std::vector<size_t> sequence_counts;
317 for (
const auto& range : active_ranges_complement) {
318 unique_scalars.emplace_back(polynomial.
span[range.first]);
319 sequence_counts.emplace_back(range.second - range.first);
323 auto reduced_points = BatchedAddition::add_in_place(points, sequence_counts);
328 for (
auto [scalar, point] :
zip_view(unique_scalars, reduced_points)) {
329 result = result + point * scalar;
340 size_t final_active_wire_idx = 0)
#define BB_ASSERT_LTE(left, right,...)
#define BB_BENCH_NAME(name)
Class for handling fast batched affine addition of large sets of EC points.
CommitmentKey object over a pairing group 𝔾₁.
std::vector< Commitment > batch_commit(RefSpan< Polynomial< Fr > > polynomials, size_t max_batch_size=std::numeric_limits< size_t >::max()) const
Batch commitment to multiple polynomials.
typename Curve::AffineElement G1
@ StructuredNonZeroComplement
typename Curve::ScalarField Fr
static constexpr size_t EXTRA_SRS_POINTS_FOR_ECCVM_IPA
typename Curve::AffineElement Commitment
CommitmentKey(const size_t num_points)
Construct a new Kate Commitment Key object from existing SRS.
Commitment commit_structured(PolynomialSpan< const Fr > polynomial, const std::vector< std::pair< size_t, size_t > > &active_ranges, size_t final_active_wire_idx=0)
Efficiently commit to a polynomial whose nonzero elements are arranged in discrete blocks.
Commitment commit(PolynomialSpan< const Fr > polynomial) const
Uses the ProverSRS to create a commitment to p(X)
bool initialized() const
Checks the commitment key is properly initialized.
std::shared_ptr< srs::factories::Crs< Curve > > srs
CommitBatch start_batch()
Commitment commit_structured_with_nonzero_complement(PolynomialSpan< const Fr > polynomial, const std::vector< std::pair< size_t, size_t > > &active_ranges, size_t final_active_wire_idx=0)
Efficiently commit to a polynomial with discrete blocks of arbitrary elements and constant elements.
Commitment commit_with_type(PolynomialSpan< const Fr > poly, CommitType type, const std::vector< std::pair< size_t, size_t > > &active_ranges={}, size_t final_active_wire_idx=0)
static size_t get_num_needed_srs_points(size_t num_points)
Structured polynomial class that represents the coefficients 'a' of a_0 + a_1 x .....
void mask()
Add random values to the coefficients of a polynomial. In practice, this is used for ensuring the com...
A template class for a reference vector. Behaves as if std::vector<T&> was possible.
typename Group::affine_element AffineElement
static std::vector< AffineElement > batch_multi_scalar_mul(std::span< std::span< const AffineElement > > points, std::span< std::span< ScalarField > > scalars, bool handle_edge_cases=true) noexcept
Compute multiple multi-scalar multiplications.
std::string format(Args... args)
constexpr T round_up_power_2(const T in)
Entry point for Barretenberg command-line interface.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
std::vector< std::string > labels
std::vector< Commitment > commit_and_send_to_verifier(auto transcript, size_t max_batch_size=std::numeric_limits< size_t >::max())
void add_to_batch(Polynomial< Fr > &poly, const std::string &label, bool mask)
RefVector< Polynomial< Fr > > wires
void throw_or_abort(std::string const &err)