67 const size_t num_gates = (1 << log_num_gates);
68 for (
size_t i = 0; i < num_gates; ++i) {
70 uint32_t a_idx =
builder.add_variable(
a);
75 uint32_t b_idx =
builder.add_variable(
b);
76 uint32_t c_idx =
builder.add_variable(c);
77 uint32_t d_idx =
builder.add_variable(d);
79 builder.create_big_add_gate({ a_idx, b_idx, c_idx, d_idx,
fr(1),
fr(1),
fr(1),
fr(-1),
fr(0) });
103 auto verification_key =
105 InnerProver inner_prover(prover_instance, verification_key);
110 auto stdlib_vk_and_hash =
114 verifier.verifier_instance->vk_and_hash->vk->pub_inputs_offset.fix_witness();
116 verifier.verifier_instance->vk_and_hash->vk->log_circuit_size.fix_witness();
118 StdlibProof stdlib_inner_proof(outer_circuit, inner_proof);
119 VerifierOutput output = verifier.template verify_proof<DefaultIO<OuterBuilder>>(stdlib_inner_proof);
128 pairing_points.P0.fix_witness();
129 pairing_points.P1.fix_witness();
132 outer_circuit.ipa_proof = output.
ipa_proof.get_value();
134 info(
"Recursive Verifier: num gates = ", outer_circuit.get_num_finalized_gates_inefficient());
137 EXPECT_EQ(outer_circuit.failed(),
false) << outer_circuit.err();
139 outer_circuit.finalize_circuit(
false);
141 auto [cc, variables_in_one_gate] = graph.analyze_circuit(
true);
142 EXPECT_EQ(cc.size(), 1);
143 EXPECT_EQ(variables_in_one_gate.size(), 2);
148using Flavors = testing::Types<UltraRecursiveFlavor_<UltraCircuitBuilder>>;
154 TestFixture::test_recursive_verification();
A ProverInstance is normally constructed from a finalized circuit and it contains all the information...
A simple wrapper around a vector of stdlib field elements representing a proof.
Test suite for recursive verification of Honk proofs for both Ultra and Mega arithmetisation.
typename RecursiveFlavor::NativeFlavor InnerFlavor
static InnerBuilder create_inner_circuit(size_t log_num_gates=10)
Create a non-trivial arbitrary inner circuit, the proof of which will be recursively verified.
typename RecursiveVerifier::VerificationKey VerificationKey
static void SetUpTestSuite()
typename RecursiveFlavor::CircuitBuilder OuterBuilder
static void test_recursive_verification()
Construct a recursive verification circuit for the proof of an inner circuit then check the number of...
std::conditional_t< IsMegaBuilder< OuterBuilder >, MegaFlavor, std::conditional_t< HasIPAAccumulator< RecursiveFlavor >, UltraRollupFlavor, UltraFlavor > > OuterFlavor
InnerFlavor::Commitment InnerCommitment
typename InnerFlavor::CircuitBuilder InnerBuilder
static void add_default(Builder &builder)
Add default public inputs when they are not present.
static void add_default(Builder &builder)
Add default public inputs when they are not present.
std::shared_ptr< RecursiveVerifierInstance > verifier_instance
typename Flavor::VerificationKey VerificationKey
Base class templates for structures that contain data parameterized by the fundamental polynomials of...
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
testing::Types< UltraRecursiveFlavor_< UltraCircuitBuilder > > Flavors
TYPED_TEST_SUITE(BoomerangRecursiveVerifierTest, Flavors)
field< Bn254FrParams > fr
UltraStaticAnalyzer StaticAnalyzer
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
static field random_element(numeric::RNG *engine=nullptr) noexcept
curve::BN254::ScalarField ScalarFieldNative
An object storing two EC points that represent the inputs to a pairing check.
OpeningClaim< grumpkin< Builder > > ipa_claim
PairingPoints< Curve > points_accumulator
stdlib::Proof< Builder > ipa_proof
#define HEAVY_TYPED_TEST(x, y)