23class MultilinearBatchingGraphDescriptionTests :
public ::testing::Test {
29 static constexpr size_t LOG_N = 5;
31 static constexpr size_t NUM_CLAIMS = CHONK_MAX_CLAIMS_PER_KERNEL;
36 static FF mle_padded(
const Polynomial<FF>& poly,
const std::vector<FF>& r,
bool shift =
false)
38 std::vector<FF> head(r.begin(), r.begin() + LOG_N);
40 for (
size_t j = LOG_N; j < r.size(); ++j) {
54 static ClaimSet build_honest_claims()
56 const size_t dyadic_size = 1UL << LOG_N;
60 for (
size_t i = 0; i < NUM_CLAIMS; ++i) {
61 std::vector<FF> challenge(VIRTUAL_LOG_N);
62 for (
auto& c : challenge) {
69 const FF non_shifted_eval = mle_padded(non_shifted, challenge);
70 const FF shifted_eval = mle_padded(shifted, challenge,
true);
71 const Commitment non_shifted_commitment = commitment_key.commit(non_shifted);
72 const Commitment shifted_commitment = commitment_key.commit(shifted);
74 set.verifier_claims.push_back(VerifierClaim{ .challenge = challenge,
75 .non_shifted_evaluation = non_shifted_eval,
76 .shifted_evaluation = shifted_eval,
77 .non_shifted_commitment = non_shifted_commitment,
78 .shifted_commitment = shifted_commitment });
79 set.prover_claims.push_back(ProverClaim{ .challenge =
std::move(challenge),
80 .non_shifted_evaluation = non_shifted_eval,
81 .shifted_evaluation = shifted_eval,
82 .non_shifted_polynomial =
std::move(non_shifted),
84 .non_shifted_commitment = non_shifted_commitment,
85 .shifted_commitment = shifted_commitment,
86 .dyadic_size = dyadic_size });
92TEST_F(MultilinearBatchingGraphDescriptionTests, RecursiveVerifierGraphDescription)
94 ClaimSet set = build_honest_claims();
101 HonkProof proof = prover.construct_proof();
104 using RecursiveCurve =
typename RecursiveVerifier::Curve;
106 using RecursiveFF =
typename RecursiveCurve::ScalarField;
110 typename RecursiveVerifier::Proof stdlib_proof(
builder, proof);
111 transcript->load_proof(stdlib_proof);
112 RecursiveFF seed = transcript->template receive_from_prover<RecursiveFF>(
"init");
118 recursive_claims.reserve(set.verifier_claims.size());
119 for (
const auto& claim : set.verifier_claims) {
120 RecursiveClaim recursive_claim = RecursiveClaim::template stdlib_from_native<RecursiveCurve>(&
builder, claim);
123 for (
auto& challenge_element : recursive_claim.challenge) {
124 challenge_element.unset_free_witness_tag();
126 recursive_claim.non_shifted_evaluation.unset_free_witness_tag();
127 recursive_claim.shifted_evaluation.unset_free_witness_tag();
131 recursive_claim.non_shifted_evaluation.fix_witness();
132 recursive_claim.shifted_evaluation.fix_witness();
133 recursive_claim.non_shifted_commitment.unset_free_witness_tag();
134 recursive_claim.shifted_commitment.unset_free_witness_tag();
135 recursive_claims.push_back(
std::move(recursive_claim));
138 RecursiveVerifier verifier(transcript);
139 auto [verified, new_claim] = verifier.verify_proof(recursive_claims);
141 EXPECT_TRUE(verified);
147 for (
auto& challenge_element : new_claim.challenge) {
148 challenge_element.fix_witness();
150 new_claim.non_shifted_evaluation.fix_witness();
151 new_claim.shifted_evaluation.fix_witness();
152 new_claim.non_shifted_commitment.fix_witness();
153 new_claim.shifted_commitment.fix_witness();
155 info(
"Multilinear batching recursive verifier: finalized num gates = ",
156 builder.get_num_finalized_gates_inefficient());
159 auto [connected_components, variables_in_one_gate] = analyzer.analyze_circuit();
160 EXPECT_EQ(connected_components.size(), 1);
161 for (
const uint32_t var_idx : variables_in_one_gate) {
162 analyzer.print_variable_info(var_idx);
164 EXPECT_EQ(variables_in_one_gate.size(), 0);
CommitmentKey object over a pairing group 𝔾₁.
static constexpr size_t VIRTUAL_LOG_N
Public entrypoint for multilinear batching.
static Polynomial random(size_t size, size_t start_index=0)
Fr evaluate_mle(std::span< const Fr > evaluation_points, bool shift=false) const
evaluate multi-linear extension p(X_0,…,X_{n-1}) = \sum_i a_i*L_i(X_0,…,X_{n-1}) at u = (u_0,...
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
typename Group::affine_element AffineElement
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
Entry point for Barretenberg command-line interface.
std::vector< fr > HonkProof
TEST_F(IPATest, ChallengesAreZero)
MultilinearBatchingVerifier< true > MultilinearBatchingRecursiveVerifier
StaticAnalyzer_< bb::fr, bb::MegaCircuitBuilder > MegaStaticAnalyzer
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Prover's claim for multilinear batching - contains polynomials and their evaluation claims.
Verifier's claim for multilinear batching - contains commitments and evaluation claims.
static field random_element(numeric::RNG *engine=nullptr) noexcept