35template <
typename Builder>
40template <
typename Builder>
54 void update(T& other,
bool update_ipa_data)
59 if (this->points_accumulator.
has_data) {
60 this->points_accumulator.
aggregate(other.points_accumulator);
62 this->points_accumulator = other.points_accumulator;
65 if (update_ipa_data) {
68 this->nested_ipa_proofs.push_back(other.ipa_proof);
69 this->nested_ipa_claims.push_back(other.ipa_claim);
72 this->nested_ipa_proofs.insert(
73 this->nested_ipa_proofs.end(), other.nested_ipa_proofs.begin(), other.nested_ipa_proofs.end());
74 this->nested_ipa_claims.insert(
75 this->nested_ipa_claims.end(), other.nested_ipa_claims.begin(), other.nested_ipa_claims.end());
81template <
typename Builder>
87 if (collect_gates_per_opcode) {
94 for (
auto [constraint, opcode_idx] :
103 for (
auto [big_constraint, opcode_idx] :
110 for (
const auto& [constraint, opcode_idx] :
113 builder, constraint.a, constraint.b, constraint.result, constraint.num_bits, constraint.is_xor_gate);
118 for (
const auto& [constraint, opcode_idx] :
120 builder.create_range_constraint(constraint.witness, constraint.num_bits,
"");
125 for (
const auto& [constraint, opcode_idx] :
132 for (
const auto& [constraint, opcode_idx] :
139 for (
const auto& [constraint, opcode_idx] :
141 create_ecdsa_verify_constraints<stdlib::secp256k1<Builder>>(
builder, constraint);
146 for (
const auto& [constraint, opcode_idx] :
148 create_ecdsa_verify_constraints<stdlib::secp256r1<Builder>>(
builder, constraint);
153 for (
const auto& [constraint, opcode_idx] :
160 for (
const auto& [constraint, opcode_idx] :
167 for (
const auto& [constraint, opcode_idx] :
174 for (
const auto& [constraint, opcode_idx] :
181 for (
const auto& [constraint, opcode_idx] :
189 for (
const auto& [constraint, opcode_idx] :
196 for (
const auto& [constraint, opcode_indices] :
199 if (collect_gates_per_opcode) {
200 size_t avg_gates_per_opcode = gate_counter.compute_diff() / opcode_indices.size();
201 for (
size_t opcode_index : opcode_indices) {
215 BB_ASSERT_EQ(!has_honk_recursion_constraints || !has_hn_recursion_constraints,
217 "Invalid circuit: both honk and ivc recursion constraints present.");
220 if (has_avm_recursion_constraints) {
221 info(
"WARNING: this circuit contains unhandled avm_recursion_constraints!");
224 if (has_honk_recursion_constraints) {
232 }
else if (has_hn_recursion_constraints) {
239 bool has_pairing_points =
240 has_honk_recursion_constraints || has_chonk_recursion_constraints || has_avm_recursion_constraints;
251 "Invalid circuit: HN recursion constraints are present with UltraBuilder.");
252 BB_ASSERT_EQ(!(has_chonk_recursion_constraints && has_honk_recursion_constraints),
254 "Invalid circuit: both honk and chonk recursion constraints are present.");
255 if (has_chonk_recursion_constraints && has_avm_recursion_constraints) {
257 "WARNING: both chonk and avm recursion constraints are present. While we support this combination, we "
258 "expect to see it only in a mock "
265 if (has_honk_recursion_constraints) {
269 if (has_chonk_recursion_constraints) {
273 if (has_avm_recursion_constraints) {
286 auto [ipa_claim, ipa_proof] =
296 inputs.ipa_claim = ipa_claim;
307 static_cast<size_t>(0),
308 "IPA proofs present when not expected.");
312 if (has_pairing_points) {
331template <
typename Builder>
339 nested_ipa_claims.size(), nested_ipa_proofs.size(),
"Mismatched number of nested IPA claims and proofs.");
340 BB_ASSERT_EQ(nested_ipa_claims.size(), 2U,
"Root rollup must have two nested IPA claims.");
350 verifier_commitment_key, ipa_claim, accumulated_ipa_transcript);
361template <
typename Builder>
368 nested_ipa_claims.size(), nested_ipa_proofs.size(),
"Mismatched number of nested IPA claims and proofs.");
373 if (nested_ipa_claims.size() == 2) {
381 commitment_key, ipa_transcript_1, nested_ipa_claims[0], ipa_transcript_2, nested_ipa_claims[1]);
383 final_ipa_claim = ipa_claim;
384 final_ipa_proof = ipa_proof;
385 }
else if (nested_ipa_claims.size() == 1) {
387 final_ipa_claim = nested_ipa_claims[0];
390 final_ipa_proof = nested_ipa_proofs[0].get_value();
391 }
else if (nested_ipa_claims.empty()) {
394 info(
"Proving with UltraRollupHonk but no IPA claims exist.");
395 auto [stdlib_opening_claim, ipa_proof] =
398 final_ipa_claim = stdlib_opening_claim;
399 final_ipa_proof = ipa_proof;
408 return { final_ipa_claim, final_ipa_proof };
411template <
typename Builder>
412[[nodiscard(
"IPA claim and Pairing points should be accumulated")]] HonkRecursionConstraintsOutput<Builder>
417 for (
const auto& [constraint, opcode_idx] :
zip_view(
421 if (constraint.proof_type ==
HONK_ZK) {
422 honk_recursion_constraint =
423 create_honk_recursion_constraints<UltraZKRecursiveFlavor_<Builder>>(
builder, constraint);
424 }
else if (constraint.proof_type ==
HONK) {
425 honk_recursion_constraint =
426 create_honk_recursion_constraints<UltraRecursiveFlavor_<Builder>>(
builder, constraint);
429 throw_or_abort(
"Rollup Honk proof type not supported on MegaBuilder");
431 honk_recursion_constraint =
432 create_honk_recursion_constraints<UltraRollupRecursiveFlavor_<Builder>>(
builder, constraint);
439 output.
update(honk_recursion_constraint,
447 "Root rollup must accumulate two IPA proofs.");
464 ivc->verification_queue.size(),
465 "WARNING: Mismatch in number of recursive verifications during kernel creation!");
469 if (
builder.is_write_vk_mode()) {
471 for (
auto [constraint, queue_entry] :
474 builder.set_variable(constraint.key_hash, queue_entry.honk_vk->hash());
485 StdlibVerificationKey::from_witness_indices(
builder, constraint.key)),
486 StdlibFF::from_witness_index(&
builder, constraint.key_hash)));
489 ivc->instantiate_stdlib_verification_queue(
builder, stdlib_vk_and_hashs);
495 for (
auto [constraint, queue_entry] :
499 std::vector<uint32_t> public_input_indices =
501 constraint.public_inputs.size());
504 for (
auto [witness_idx, constraint_witness_idx] :
505 zip_view(public_input_indices, constraint.public_inputs)) {
506 builder.assert_equal(witness_idx, constraint_witness_idx);
511 ivc->complete_kernel_circuit_logic(
builder);
521 if (ivc_base ==
nullptr) {
524 process_with_ivc(mock_ivc);
527 process_with_ivc(sumcheck_ivc);
531[[nodiscard(
"IPA claim and Pairing points should be accumulated")]] HonkRecursionConstraintsOutput<UltraCircuitBuilder>
538 for (
const auto& [constraint, opcode_idx] :
545 output.
update(honk_output,
true);
553[[nodiscard(
"IPA claim and Pairing points should be accumulated")]] HonkRecursionConstraintsOutput<UltraCircuitBuilder>
560 for (
const auto& [constraint, opcode_idx] :
zip_view(
566 output.
update(avm2_recursion_output,
true);
584 const bool is_write_vk_mode = witness.empty();
586 if (!is_write_vk_mode) {
589 "ACIR witness size (" << witness.size() <<
") does not match max witness index ("
600 vinfo(
"Created circuit");
616 const bool is_write_vk_mode = witness.empty();
618 if (!is_write_vk_mode) {
621 "ACIR witness size (" << witness.size() <<
") does not match max witness index ("
635 vinfo(
"Created circuit");
#define BB_ASSERT(expression,...)
#define BB_ASSERT_EQ(actual, expected,...)
Shared type definitions for the Barretenberg RPC API.
Common transcript class for both parties. Stores the data for the current round, as well as the manif...
RecursiveFlavor::VerificationKey RecursiveVerificationKey
RecursiveFlavor::VKAndHash RecursiveVKAndHash
CommitmentKey object over a pairing group 𝔾₁.
IPA (inner product argument) commitment scheme class.
typename Curve::ScalarField FF
Unverified claim (C,r,v) for some witness polynomial p(X) such that.
An object storing two EC points that represent the inputs to a pairing check.
Representation of the Grumpkin Verifier Commitment Key inside a bn254 circuit.
A simple wrapper around a vector of stdlib field elements representing a proof.
Manages the data that is propagated on the public inputs of an application/function circuit.
PairingInputs pairing_inputs
static void add_default(Builder &builder)
Add default public inputs when they are not present.
The data that is propagated on the public inputs of a rollup circuit.
Base class templates for structures that contain data parameterized by the fundamental polynomials of...
Entry point for Barretenberg command-line interface.
std::vector< fr > HonkProof
BaseTranscript< stdlib::StdlibCodec< stdlib::field_t< UltraCircuitBuilder > >, stdlib::poseidon2< UltraCircuitBuilder > > UltraStdlibTranscript
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Curve grumpkin in circuit setting.
void aggregate(PairingPoints const &other)
Compute a linear combination of the present pairing points with an input set of pairing points.
static PairingPoints construct_default()
Construct default pairing points.
void throw_or_abort(std::string const &err)