51 template <
size_t log_poly_length>
57 EXPECT_EQ(1UL << log_poly_length, poly.
size());
66 std::vector<DataType> proof;
68 NativeIPA::compute_opening_proof(this->
ck(), prover_claim, prover_transcript);
69 proof = prover_transcript->export_proof();
75 auto stdlib_comm = Curve::Group::from_witness(&
builder, commitment);
76 auto stdlib_x = Curve::ScalarField::from_witness(&
builder, x);
77 auto stdlib_eval = Curve::ScalarField::from_witness(&
builder, eval);
82 return { recursive_verifier_transcript, stdlib_opening_claim };
98 auto [stdlib_transcript, stdlib_claim] = create_ipa_claim<log_poly_length>(
builder, poly, x);
100 RecursiveIPA::reduce_verify(stdlib_claim, stdlib_transcript);
102 builder.finalize_circuit(
true);
108 template <
size_t log_poly_length>
112 static constexpr size_t poly_length = 1UL << log_poly_length;
120 for (
size_t i = 0; i < poly_length / 2; ++i) {
126 for (
size_t i = 0; i < std::min<size_t>(100, poly_length / 2); ++i) {
145 Builder builder(build_ipa_recursive_verifier_circuit<log_poly_length>(poly, x));
146 info(
"IPA Recursive Verifier num finalized gates = ",
builder.get_num_finalized_gates());
165 auto [transcript_1, claim_1] = create_ipa_claim<log_poly_length>(
builder, poly1, x1);
166 auto [transcript_2, claim_2] = create_ipa_claim<log_poly_length>(
builder, poly2, x2);
170 auto [output_claim, ipa_proof] =
171 RecursiveIPA::accumulate(this->
ck(), transcript_1, claim_1, transcript_2, claim_2);
172 output_claim.set_public();
173 output_claim.commitment.fix_witness();
175 builder.finalize_circuit(
false);
179 bb::fq(output_claim.opening_pair.evaluation.get_value()) };
180 Commitment native_comm = output_claim.commitment.get_value();
186 auto result = NativeIPA::reduce_verify(this->
vk(), opening_claim, verifier_transcript);
190 auto tool_results = tool.analyze_circuit();
191 EXPECT_EQ(tool_results.first.size(), 1);
192 EXPECT_EQ(tool_results.second.size(), 0);
198 static constexpr size_t log_poly_length = 10;
199 static constexpr size_t poly_length = 1UL << log_poly_length;
203 auto [poly, x] = generate_poly_and_challenge<log_poly_length>();
204 auto [stdlib_transcript, stdlib_claim] = create_ipa_claim<log_poly_length>(
builder, poly, x);
207 auto result = RecursiveIPA::full_verify_recursive(stdlib_pcs_vkey, stdlib_claim, stdlib_transcript);
209 builder.finalize_circuit(
true);
212 auto tool_results = tool.analyze_circuit();
213 EXPECT_EQ(tool_results.first.size(), 1);
214 EXPECT_EQ(tool_results.second.size(), 0);
219 static constexpr size_t log_poly_length = 2;
220 auto [poly1, x1] = generate_poly_and_challenge<log_poly_length>(PolyType::Random);
221 auto [poly2, x2] = generate_poly_and_challenge<log_poly_length>(PolyType::Random);
222 test_accumulation<log_poly_length>(poly1, poly2, x1, x2);
227 static constexpr size_t log_poly_length = 10;
228 auto [poly1, x1] = generate_poly_and_challenge<log_poly_length>();
229 auto [poly2, x2] = generate_poly_and_challenge<log_poly_length>();
230 test_accumulation<log_poly_length>(poly1, poly2, x1, x2);
235 static constexpr size_t log_poly_length = 10;
236 static constexpr size_t poly_length = 1UL << log_poly_length;
238 auto x1 = this->random_element();
239 auto [poly2, x2] = generate_poly_and_challenge<log_poly_length>();
240 test_accumulation<log_poly_length>(poly1, poly2, x1, x2);
245 static constexpr size_t log_poly_length = 10;
253 auto [poly1, x1] = generate_poly_and_challenge<log_poly_length>();
254 auto [poly2, x2] = generate_poly_and_challenge<log_poly_length>();
256 auto [transcript_1, claim_1] = create_ipa_claim<log_poly_length>(
builder, poly1, x1);
257 auto [transcript_2, claim_2] = create_ipa_claim<log_poly_length>(
builder, poly2, x2);
261 auto [output_claim, ipa_proof] = RecursiveIPA::accumulate(this->
ck(), transcript_1, claim_1, transcript_2, claim_2);
262 output_claim.set_public();
264 builder.finalize_circuit(
false);
272 Curve::ScalarField::create_from_u512_as_witness(&root_rollup, output_claim.opening_pair.challenge.get_value());
274 Curve::ScalarField::create_from_u512_as_witness(&root_rollup, output_claim.opening_pair.evaluation.get_value());
275 ipa_claim.
commitment = Curve::AffineElement::from_witness(&root_rollup, output_claim.commitment.get_value());
276 auto result = RecursiveIPA::full_verify_recursive(stdlib_pcs_vkey, ipa_claim, stdlib_verifier_transcript);
277 root_rollup.finalize_circuit(
true);
281 auto tool_results = tool.analyze_circuit();
282 EXPECT_EQ(tool_results.first.size(), 1);
283 EXPECT_EQ(tool_results.second.size(), 0);
#define BB_DISABLE_ASSERTS()
bb::stdlib::Proof< Builder > StdlibProof
std::pair< std::shared_ptr< StdlibTranscript >, OpeningClaim< Curve > > create_ipa_claim(Builder &builder, Polynomial &poly, Fr x)
Given a builder, polynomial, and challenge point, return the transcript and opening claim in circuit.
std::tuple< Polynomial, Fr > generate_poly_and_challenge(PolyType poly_type=PolyType::Random)
Builder build_ipa_recursive_verifier_circuit(Polynomial &poly, Fr x)
Given a poly and a challenge x, return the recursive verifier circuit.
typename NativeCurve::ScalarField Fr
void test_accumulation(Polynomial &poly1, Polynomial &poly2, Fr x1, Fr x2)
Tests IPA accumulation by accumulating two IPA claims and proving the accumulated claim.
typename NativeCurve::Element GroupElement
typename NativeCurve::AffineElement Commitment
void test_recursive_ipa(Polynomial &poly, Fr x)
Tests IPA recursion.
Common transcript class for both parties. Stores the data for the current round, as well as the manif...
typename Codec::DataType DataType
CommitmentKey object over a pairing group 𝔾₁.
Commitment commit(const Polynomial &polynomial)
IPA (inner product argument) commitment scheme class.
Unverified claim (C,r,v) for some witness polynomial p(X) such that.
OpeningPair< Curve > opening_pair
Opening pair (r,v) for some witness polynomial p(X) such that p(r) = v.
Structured polynomial class that represents the coefficients 'a' of a_0 + a_1 x .....
static Polynomial random(size_t size, size_t start_index=0)
Fr evaluate(const Fr &z, size_t target_size) const
Fr & at(size_t index)
Our mutable accessor, unlike operator[]. We abuse precedent a bit to differentiate at() and operator[...
Polynomial p and an opening pair (r,v) such that p(r) = v.
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
Representation of the Grumpkin Verifier Commitment Key inside a bn254 circuit.
typename Group::element Element
typename Group::affine_element AffineElement
virtual uint64_t get_random_uint64()=0
A simple wrapper around a vector of stdlib field elements representing a proof.
static void add_default(Builder &builder)
Add default public inputs when they are not present.
TEST_F(BoomerangIPARecursiveTests, FullRecursiveVerifierMediumRandom)
Entry point for Barretenberg command-line interface.
field< Bn254FqParams > fq
BaseTranscript< stdlib::StdlibCodec< stdlib::field_t< UltraCircuitBuilder > >, stdlib::poseidon2< UltraCircuitBuilder > > UltraStdlibTranscript
UltraCircuitBuilder_< UltraExecutionTraceBlocks > UltraCircuitBuilder
CommitmentKey< Curve > ck
VerifierCommitmentKey< Curve > vk
UltraStaticAnalyzer StaticAnalyzer
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
static constexpr field zero()
Curve grumpkin in circuit setting.