24 static constexpr size_t log_n = 7;
28 static constexpr size_t n = 1UL << log_n;
32 static uint256_t random_127_bit_challenge()
37 c.
data[1] &= 0x7FFFFFFFFFFFFFFFULL;
43 ck = create_commitment_key<CK>(n);
44 vk = create_verifier_commitment_key<VK>();
54 Commitment commitment =
ck.commit(poly);
57 PCS::compute_opening_proof(ck, { poly, { x, eval } }, prover_transcript);
58 return { { { x, eval }, commitment }, prover_transcript->export_proof() };
63 struct ResultOfProveVerify {
69 static ResultOfProveVerify run_native_prove_verify(
const Polynomial& poly,
const Fr x)
71 Commitment commitment =
ck.commit(poly);
75 PCS::compute_opening_proof(ck, { poly, { x, eval } }, prover_transcript);
80 bool result = PCS::reduce_verify(vk, { { x, eval }, commitment }, verifier_transcript);
81 return {
result, prover_transcript, verifier_transcript };
95 auto x = this->random_element();
96 bool result = run_native_prove_verify(poly, x).result;
106 for (
size_t i = 0; i < n / 2; ++i) {
107 poly_even.
at(2 * i) = this->random_element();
108 poly_odd.
at(2 * i + 1) = this->random_element();
110 auto x = this->random_element();
111 bool result_even = run_native_prove_verify(poly_even, x).result;
112 bool result_odd = run_native_prove_verify(poly_odd, x).result;
113 EXPECT_TRUE(result_even && result_odd);
122 bool result = run_native_prove_verify(poly, x).result;
131 auto x = this->random_element();
132 auto result_of_prove_verify = run_native_prove_verify(poly, x);
133 EXPECT_TRUE(result_of_prove_verify.result);
135 EXPECT_EQ(result_of_prove_verify.prover_transcript->get_manifest(),
136 result_of_prove_verify.verifier_transcript->get_manifest());
144 auto x = this->random_element();
145 auto initial_evaluation = poly.
evaluate(x);
146 auto change_in_linear_coefficient = initial_evaluation / x;
148 poly.
at(1) -= change_in_linear_coefficient;
151 bool result = run_native_prove_verify(poly, x).result;
158#if !defined(__wasm__)
164 auto [x, eval] = this->random_eval(poly);
165 auto commitment =
ck.commit(poly);
175 for (
size_t i = 0; i < num_challenges; i++) {
176 random_vector[i] = random_127_bit_challenge();
181 for (
size_t i = 0; i < num_challenges; i++) {
182 auto new_random_vector = random_vector;
184 transcript->initialize(new_random_vector);
185 EXPECT_ANY_THROW(PCS::compute_opening_proof<MockTranscript>(
ck, { poly, opening_pair }, transcript));
190 for (
size_t i = 0; i < num_challenges * 2; i++) {
191 lrs[i] = Curve::AffineElement::one();
195 for (
size_t i = 0; i < num_challenges; i++) {
196 auto new_random_vector = random_vector;
198 transcript->initialize(new_random_vector, lrs, {
uint256_t(n) });
199 EXPECT_ANY_THROW(PCS::reduce_verify(
vk, opening_claim, transcript));
210 const size_t num_challenges = log_n + 1;
212 for (
size_t i = 0; i < num_challenges; i++) {
213 random_vector[i] = random_127_bit_challenge();
215 const Fr u =
Fr(random_vector[1]);
221 for (
size_t i = 0; i < n / 2; i++) {
223 poly.
at(i + (n / 2)) = neg_u_inv * poly[i];
225 auto [x, eval] = this->random_eval(poly);
226 auto commitment =
ck.commit(poly);
231 transcript->initialize(random_vector);
234 PCS::compute_opening_proof<MockTranscript>(
ck, { poly, opening_pair }, transcript);
237 transcript->reset_indices();
240 EXPECT_TRUE(PCS::reduce_verify(
vk, opening_claim, transcript));
249TEST_F(IPATest, BatchVerifyTwoValidProofs)
251 auto [claim1, proof1] = generate_random_proof();
252 auto [claim2, proof2] = generate_random_proof();
258 EXPECT_TRUE(PCS::batch_reduce_verify(
vk, claims, transcripts));
264 auto [claim, proof_data] = generate_random_proof();
270TEST_F(IPATest, BatchVerifyRejectsTamperedGZero)
272 auto [claim, proof_data] = generate_random_proof();
273 auto tampered_proof = proof_data;
275 constexpr size_t commitment_size = FrCodec::template calc_num_fields<Commitment>();
276 constexpr size_t g_zero_offset = 2 * log_n * commitment_size;
277 static_assert(g_zero_offset + commitment_size + FrCodec::template calc_num_fields<Fr>() == 4 * log_n + 4);
278 ASSERT_LE(g_zero_offset + commitment_size, tampered_proof.size());
280 Commitment wrong_g_zero = Commitment::one() *
Fr(7);
281 auto wrong_g_zero_fields = FrCodec::serialize_to_fields<Commitment>(wrong_g_zero);
283 wrong_g_zero_fields.end(),
284 tampered_proof.begin() +
static_cast<std::ptrdiff_t>(g_zero_offset));
290TEST_F(IPATest, BatchVerifyRejectsTamperedAZero)
292 auto [claim, proof_data] = generate_random_proof();
293 auto tampered_proof = proof_data;
295 constexpr size_t commitment_size = FrCodec::template calc_num_fields<Commitment>();
296 constexpr size_t g_zero_offset = 2 * log_n * commitment_size;
297 constexpr size_t a_zero_offset = g_zero_offset + commitment_size;
298 static_assert(a_zero_offset + FrCodec::template calc_num_fields<Fr>() == 4 * log_n + 4);
299 ASSERT_LT(a_zero_offset, tampered_proof.size());
301 auto wrong_a_zero_fields = FrCodec::serialize_to_fields<Fr>(
Fr(7));
303 wrong_a_zero_fields.end(),
304 tampered_proof.begin() +
static_cast<std::ptrdiff_t>(a_zero_offset));
312 auto [claim1, proof1] = generate_random_proof();
313 auto [claim2, proof2] = generate_random_proof();
316 claim2.opening_pair.evaluation +=
Fr::one();
322 EXPECT_FALSE(PCS::batch_reduce_verify(
vk, claims, transcripts));
325TEST_F(IPATest, BatchVerifyRejectsClaimTranscriptMismatch)
330 auto [claim1, proof1] = generate_random_proof();
331 auto [claim2, proof2] = generate_random_proof();
336 EXPECT_TRUE(PCS::batch_reduce_verify(
340 EXPECT_FALSE(PCS::batch_reduce_verify(
std::vector< DataType > Proof
CommitmentKey object over a pairing group 𝔾₁.
static void SetUpTestSuite()
IPA (inner product argument) commitment scheme class.
Unverified claim (C,r,v) for some witness polynomial p(X) such that.
Opening pair (r,v) for some witness polynomial p(X) such that p(r) = v.
static Polynomial random(size_t size, size_t start_index=0)
Fr evaluate(const Fr &z) const
Fr & at(size_t index)
Our mutable accessor, unlike operator[]. We abuse precedent a bit to differentiate at() and operator[...
Representation of the Grumpkin Verifier Commitment Key inside a bn254 circuit.
typename Group::element Element
typename Group::affine_element AffineElement
void generate_proof(uint256_t inputs[])
TEST_F(IPATest, OpenZeroPolynomial)
constexpr T get_msb(const T in)
Entry point for Barretenberg command-line interface.
TEST_F(IPATest, ChallengesAreZero)
CommitmentKey< Curve > ck
VerifierCommitmentKey< Curve > vk
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
static constexpr field one()
constexpr field invert() const noexcept
static field random_element(numeric::RNG *engine=nullptr) noexcept
static constexpr field zero()