11#include <gtest/gtest.h>
34 auto public_inputs_cols = public_inputs.to_columns();
37 return { proof, public_inputs_cols };
44 GTEST_SKIP() <<
"Skipping slow test";
47 auto [proof, public_inputs_cols] = create_proof();
50 const bool verified = verifier.verify_proof(proof, public_inputs_cols);
52 ASSERT_TRUE(verified) <<
"native proof verification failed";
58 GTEST_SKIP() <<
"Skipping slow test";
61 auto [proof, public_inputs_cols] = create_proof();
62 auto verify_with_corrupt_pi_col = [&](
size_t col_idx) {
63 public_inputs_cols[col_idx][5] +=
FF::one();
65 const bool verified = verifier.verify_proof(proof, public_inputs_cols);
66 ASSERT_FALSE(verified)
67 <<
"native proof verification succeeded, but should have failed due to corruption of public inputs col "
69 public_inputs_cols[col_idx][5] -=
FF::one();
71 for (
size_t col_idx = 0; col_idx < 4; col_idx++) {
72 verify_with_corrupt_pi_col(col_idx);
75 const bool verified = verifier.verify_proof(proof, public_inputs_cols);
76 ASSERT_TRUE(verified) <<
"native proof verification failed, but should have succeeded";
91 GTEST_SKIP() <<
"Skipping slow test";
102 AvmProver prover(proving_key, verification_key, proving_key->commitment_key);
108 auto make_malicious_shift = [] {
120 check_polys.
get(ColumnAndShifts::keccak_memory_addr_shift) = make_malicious_shift();
126 const bool verified = verifier.verify_proof(proof, public_inputs.to_columns());
128 ASSERT_FALSE(verified)
129 <<
"verifier accepted a proof where keccak_memory_addr_shift at the last row was forged to be non-zero";
163 GTEST_SKIP() <<
"Skipping slow test";
173 AvmProver prover(proving_key, verification_key, proving_key->commitment_key);
179 auto make_malicious_addr = [] {
191 check_polys.
get(ColumnAndShifts::keccak_memory_addr) = make_malicious_addr();
197 const bool verified = verifier.verify_proof(proof, public_inputs.to_columns());
199 ASSERT_FALSE(verified)
200 <<
"verifier accepted a proof where keccak_memory_addr at the first row was forged to be non-zero";
206 auto [proof, public_inputs_cols] = create_proof();
208 const size_t actual_proof_size = proof.size();
211 EXPECT_EQ(actual_proof_size, computed_proof_size)
212 <<
"Actual proof size (" << actual_proof_size <<
") does not match COMPUTED_AVM_PROOF_LENGTH_IN_FIELDS ("
213 << computed_proof_size <<
"). The formula in flavor.hpp needs to be updated.";
Structured polynomial class that represents the coefficients 'a' of a_0 + a_1 x .....
Fr & at(size_t index)
Our mutable accessor, unlike operator[]. We abuse precedent a bit to differentiate at() and operator[...
DataType & get(ColumnAndShifts c)
A container for the prover polynomials handles.
static constexpr size_t COMPUTED_AVM_PROOF_LENGTH_IN_FIELDS
AvmFlavorSettings::Polynomial Polynomial
ProverPolynomials prover_polynomials
HonkProof construct_proof()
Proof prove(tracegen::TraceContainer &&trace)
static NativeProofResult create_proof()
static void SetUpTestSuite()
uint32_t get_num_witness_rows() const
AvmProver::ProverPolynomials compute_polynomials(tracegen::TraceContainer &trace)
std::shared_ptr< AvmProver::ProvingKey > proving_key_from_polynomials(AvmProver::ProverPolynomials &polynomials)
TEST_F(AvmRecursiveTests, TwoLayerAvmRecursionFailsWithWrongPIs)
void run_check_circuit(AvmFlavor::ProverPolynomials &polys, size_t num_rows, bool skippable_enabled)
bool skip_slow_tests()
Check if slow tests should be skipped.
std::pair< tracegen::TraceContainer, PublicInputs > get_minimal_trace_with_pi()
constexpr std::size_t MAX_AVM_TRACE_SIZE
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
std::vector< std::vector< FF > > public_inputs_cols
static constexpr field one()
static constexpr uint256_t modulus