23 using Fr =
typename NativeCurve::ScalarField;
24 using GroupElement =
typename NativeCurve::Element;
28 using Commitment =
typename NativeCurve::AffineElement;
32 template <
size_t log_poly_length>
36 static constexpr size_t poly_length = 1UL << log_poly_length;
41 Commitment commitment = this->
commit(poly);
49 NativeIPA::compute_opening_proof(this->
ck(), { poly, opening_pair }, prover_transcript);
52 auto proof = prover_transcript->export_proof();
56 verifier_transcript->load_proof(proof);
58 auto result = NativeIPA::reduce_verify(this->
vk(), opening_claim, verifier_transcript);
62 auto stdlib_comm = Curve::Group::from_witness(&
builder, commitment);
63 auto stdlib_x = Curve::ScalarField::from_witness(&
builder, x);
64 auto stdlib_eval = Curve::ScalarField::from_witness(&
builder, eval);
70 return { recursive_verifier_transcript, stdlib_opening_claim };
72 template <
size_t log_poly_length>
Builder build_ipa_recursive_verifier_circuit()
77 auto [stdlib_transcript, stdlib_claim] = create_ipa_claim<log_poly_length>(
builder);
79 RecursiveIPA::reduce_verify(stdlib_claim, stdlib_transcript);
90 template <
size_t poly_length>
void test_recursive_ipa()
92 Builder builder(build_ipa_recursive_verifier_circuit<poly_length>());
93 info(
"IPA Recursive Verifier num finalized gates = ",
builder.get_num_finalized_gates());
103 template <
size_t poly_length>
void test_accumulation()
113 auto [transcript_1, claim_1] = create_ipa_claim<poly_length>(
builder);
114 auto [transcript_2, claim_2] = create_ipa_claim<poly_length>(
builder);
118 auto [output_claim, ipa_proof] =
119 RecursiveIPA::accumulate(this->
ck(), transcript_1, claim_1, transcript_2, claim_2);
120 output_claim.set_public();
122 builder.finalize_circuit(
false);
123 info(
"Circuit with 2 IPA Recursive Verifiers and IPA Accumulation num finalized gates = ",
124 builder.get_num_finalized_gates());
129 bb::fq(output_claim.opening_pair.evaluation.get_value()) };
130 Commitment native_comm = output_claim.commitment.get_value();
135 verifier_transcript->load_proof(ipa_proof);
137 auto result = NativeIPA::reduce_verify(this->
vk(), opening_claim, verifier_transcript);
151 static constexpr size_t log_poly_length = 2;
152 test_recursive_ipa<log_poly_length>();
159TEST_F(IPARecursiveTests, RecursiveMedium)
161 static constexpr size_t log_poly_length = 10;
162 test_recursive_ipa<log_poly_length>();
171 static constexpr size_t log_poly_length = CONST_ECCVM_LOG_N;
172 test_recursive_ipa<log_poly_length>();
179TEST_F(IPARecursiveTests, AccumulateSmall)
181 static constexpr size_t log_poly_length = 2;
182 test_accumulation<log_poly_length>();
189TEST_F(IPARecursiveTests, AccumulateMedium)
191 static constexpr size_t log_poly_length = 10;
192 test_accumulation<log_poly_length>();
195TEST_F(IPARecursiveTests, FullRecursiveVerifier)
198 static constexpr size_t log_poly_length = 10;
199 static constexpr size_t poly_length = 1UL << log_poly_length;
203 auto [stdlib_transcript, stdlib_claim] = create_ipa_claim<log_poly_length>(
builder);
206 auto result = RecursiveIPA::full_verify_recursive(stdlib_pcs_vkey, stdlib_claim, stdlib_transcript);
208 builder.finalize_circuit(
true);
209 info(
"Full IPA Recursive Verifier num finalized gates for length ",
210 1UL << log_poly_length,
212 builder.get_num_finalized_gates());
216TEST_F(IPARecursiveTests, AccumulationAndFullRecursiveVerifier)
218 static constexpr size_t log_poly_length = 10;
226 auto [transcript_1, claim_1] = create_ipa_claim<log_poly_length>(
builder);
227 auto [transcript_2, claim_2] = create_ipa_claim<log_poly_length>(
builder);
231 auto [output_claim, ipa_proof] = RecursiveIPA::accumulate(this->
ck(), transcript_1, claim_1, transcript_2, claim_2);
232 output_claim.set_public();
234 builder.finalize_circuit(
false);
235 info(
"Circuit with 2 IPA Recursive Verifiers and IPA Accumulation num finalized gates = ",
236 builder.get_num_finalized_gates());
244 stdlib_verifier_transcript->load_proof(StdlibProof(root_rollup, ipa_proof));
247 Curve::ScalarField::create_from_u512_as_witness(&root_rollup, output_claim.opening_pair.challenge.get_value());
249 Curve::ScalarField::create_from_u512_as_witness(&root_rollup, output_claim.opening_pair.evaluation.get_value());
250 ipa_claim.
commitment = Curve::AffineElement::from_witness(&root_rollup, output_claim.commitment.get_value());
251 auto result = RecursiveIPA::full_verify_recursive(stdlib_pcs_vkey, ipa_claim, stdlib_verifier_transcript);
252 root_rollup.finalize_circuit(
true);
254 info(
"Full IPA Recursive Verifier num finalized gates for length ",
255 1UL << log_poly_length,
257 root_rollup.get_num_finalized_gates());
CommitmentKey object over a pairing group 𝔾₁.
Commitment commit(const Polynomial &polynomial)
OpeningPair< Curve > random_eval(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)
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
Representation of the Grumpkin Verifier Commitment Key inside a bn254 circuit.
A simple wrapper around a vector of stdlib field elements representing a proof.
BaseTranscript< StdlibTranscriptParams< Builder > > StdlibTranscript
BaseTranscript< StdlibTranscriptParams< UltraCircuitBuilder > > UltraStdlibTranscript
stdlib::Proof< Builder > StdlibProof
Entry point for Barretenberg command-line interface.
field< Bn254FqParams > fq
TEST_F(IPATest, ChallengesAreZero)
UltraCircuitBuilder_< UltraExecutionTraceBlocks > UltraCircuitBuilder
CommitmentKey< Curve > ck
VerifierCommitmentKey< Curve > vk
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Curve grumpkin in circuit setting.
static void add_default_to_public_inputs(Builder &builder)
Adds default public inputs to the builder.