diff --git a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_circuit_builder.hpp index b8b87970d2a..b35cafa8e15 100644 --- a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_circuit_builder.hpp @@ -214,8 +214,6 @@ class ECCVMCircuitBuilder { return result; } - bool check_circuit() { return true; } - [[nodiscard]] size_t get_num_gates() const { // (issue #2218) diff --git a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_circuit_builder.test.cpp b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_circuit_builder.test.cpp index e1e83328b63..874f9a41345 100644 --- a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_circuit_builder.test.cpp +++ b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_circuit_builder.test.cpp @@ -1,7 +1,7 @@ -#include "eccvm_circuit_builder.hpp" #include "barretenberg/crypto/generators/generator_data.hpp" #include "barretenberg/crypto/pedersen_commitment/pedersen.hpp" #include "barretenberg/eccvm/eccvm_flavor.hpp" +#include "barretenberg/eccvm/eccvm_trace_checker.hpp" #include using namespace bb; @@ -39,7 +39,7 @@ TEST(ECCVMCircuitBuilderTests, BaseCase) op_queue->mul_accumulate(c, x); ECCVMCircuitBuilder circuit{ op_queue }; - bool result = circuit.check_circuit(); + bool result = ECCVMTraceChecker::check_circuit(circuit); EXPECT_EQ(result, true); } @@ -53,7 +53,7 @@ TEST(ECCVMCircuitBuilderTests, Add) op_queue->add_accumulate(a); ECCVMCircuitBuilder circuit{ op_queue }; - bool result = circuit.check_circuit(); + bool result = ECCVMTraceChecker::check_circuit(circuit); EXPECT_EQ(result, true); } @@ -68,7 +68,7 @@ TEST(ECCVMCircuitBuilderTests, Mul) op_queue->mul_accumulate(a, x); ECCVMCircuitBuilder circuit{ op_queue }; - bool result = circuit.check_circuit(); + bool result = ECCVMTraceChecker::check_circuit(circuit); EXPECT_EQ(result, true); } @@ -89,7 +89,7 @@ TEST(ECCVMCircuitBuilderTests, ShortMul) op_queue->eq(); ECCVMCircuitBuilder circuit{ op_queue }; - bool result = circuit.check_circuit(); + bool result = ECCVMTraceChecker::check_circuit(circuit); EXPECT_EQ(result, true); } @@ -113,7 +113,7 @@ TEST(ECCVMCircuitBuilderTests, EqFails) .z2 = 0, .mul_scalar_full = 0 }); ECCVMCircuitBuilder circuit{ op_queue }; - bool result = circuit.check_circuit(); + bool result = ECCVMTraceChecker::check_circuit(circuit); EXPECT_EQ(result, false); } @@ -124,7 +124,7 @@ TEST(ECCVMCircuitBuilderTests, EmptyRow) op_queue->empty_row(); ECCVMCircuitBuilder circuit{ op_queue }; - bool result = circuit.check_circuit(); + bool result = ECCVMTraceChecker::check_circuit(circuit); EXPECT_EQ(result, true); } @@ -141,7 +141,7 @@ TEST(ECCVMCircuitBuilderTests, EmptyRowBetweenOps) op_queue->eq(); ECCVMCircuitBuilder circuit{ op_queue }; - bool result = circuit.check_circuit(); + bool result = ECCVMTraceChecker::check_circuit(circuit); EXPECT_EQ(result, true); } @@ -157,7 +157,7 @@ TEST(ECCVMCircuitBuilderTests, EndWithEq) op_queue->eq(); ECCVMCircuitBuilder circuit{ op_queue }; - bool result = circuit.check_circuit(); + bool result = ECCVMTraceChecker::check_circuit(circuit); EXPECT_EQ(result, true); } @@ -174,7 +174,7 @@ TEST(ECCVMCircuitBuilderTests, EndWithAdd) op_queue->add_accumulate(a); ECCVMCircuitBuilder circuit{ op_queue }; - bool result = circuit.check_circuit(); + bool result = ECCVMTraceChecker::check_circuit(circuit); EXPECT_EQ(result, true); } @@ -191,7 +191,7 @@ TEST(ECCVMCircuitBuilderTests, EndWithMul) op_queue->mul_accumulate(a, x); ECCVMCircuitBuilder circuit{ op_queue }; - bool result = circuit.check_circuit(); + bool result = ECCVMTraceChecker::check_circuit(circuit); EXPECT_EQ(result, true); } @@ -209,7 +209,7 @@ TEST(ECCVMCircuitBuilderTests, EndWithNoop) op_queue->empty_row(); ECCVMCircuitBuilder circuit{ op_queue }; - bool result = circuit.check_circuit(); + bool result = ECCVMTraceChecker::check_circuit(circuit); EXPECT_EQ(result, true); } @@ -237,7 +237,7 @@ TEST(ECCVMCircuitBuilderTests, MSM) compute_msms(j, op_queue); ECCVMCircuitBuilder circuit{ op_queue }; - bool result = circuit.check_circuit(); + bool result = ECCVMTraceChecker::check_circuit(circuit); EXPECT_EQ(result, true); } // chain msms @@ -247,6 +247,6 @@ TEST(ECCVMCircuitBuilderTests, MSM) compute_msms(j, op_queue); } ECCVMCircuitBuilder circuit{ op_queue }; - bool result = circuit.check_circuit(); + bool result = ECCVMTraceChecker::check_circuit(circuit); EXPECT_EQ(result, true); } diff --git a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_flavor.hpp b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_flavor.hpp index 59858a81393..7916f19c7cf 100644 --- a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_flavor.hpp @@ -496,7 +496,9 @@ class ECCVMFlavor { const auto num_rows_log2 = static_cast(numeric::get_msb64(num_rows)); size_t num_rows_pow2 = 1UL << (num_rows_log2 + (1UL << num_rows_log2 == num_rows ? 0 : 1)); - + for (auto& poly : get_all()) { + poly = Polynomial(num_rows_pow2); + } lagrange_first[0] = 1; lagrange_second[1] = 1; lagrange_last[lagrange_last.size() - 1] = 1; diff --git a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_trace_checker.cpp b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_trace_checker.cpp new file mode 100644 index 00000000000..555c19bdcad --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_trace_checker.cpp @@ -0,0 +1,84 @@ +#include "eccvm_trace_checker.hpp" +#include "barretenberg/eccvm/eccvm_flavor.hpp" + +using namespace bb; + +using Flavor = ECCVMFlavor; +using Builder = typename ECCVMFlavor::CircuitBuilder; +using FF = typename ECCVMFlavor::FF; +using ProverPolynomials = typename ECCVMFlavor::ProverPolynomials; + +bool ECCVMTraceChecker::check_circuit(Builder& builder) +{ + const FF gamma = FF::random_element(); + const FF beta = FF::random_element(); + const FF beta_sqr = beta.sqr(); + const FF beta_cube = beta_sqr * beta; + auto eccvm_set_permutation_delta = + gamma * (gamma + beta_sqr) * (gamma + beta_sqr + beta_sqr) * (gamma + beta_sqr + beta_sqr + beta_sqr); + eccvm_set_permutation_delta = eccvm_set_permutation_delta.invert(); + bb::RelationParameters params{ + .eta = 0, + .beta = beta, + .gamma = gamma, + .public_input_delta = 0, + .lookup_grand_product_delta = 0, + .beta_sqr = beta_sqr, + .beta_cube = beta_cube, + .eccvm_set_permutation_delta = eccvm_set_permutation_delta, + }; + + ProverPolynomials polynomials(builder); + const size_t num_rows = polynomials.get_polynomial_size(); + compute_logderivative_inverse>(polynomials, params, num_rows); + compute_permutation_grand_product>(num_rows, polynomials, params); + + polynomials.z_perm_shift = Polynomial(polynomials.z_perm.shifted()); + + const auto evaluate_relation = [&](const std::string& relation_name) { + typename Relation::SumcheckArrayOfValuesOverSubrelations result; + for (auto& r : result) { + r = 0; + } + constexpr size_t NUM_SUBRELATIONS = result.size(); + + for (size_t i = 0; i < num_rows; ++i) { + Relation::accumulate(result, polynomials.get_row(i), params, 1); + + bool x = true; + for (size_t j = 0; j < NUM_SUBRELATIONS; ++j) { + if (result[j] != 0) { + info("Relation ", relation_name, ", subrelation index ", j, " failed at row ", i); + x = false; + } + } + if (!x) { + return false; + } + } + return true; + }; + + bool result = true; + result = result && evaluate_relation.template operator()>("ECCVMTranscriptRelation"); + result = result && evaluate_relation.template operator()>("ECCVMPointTableRelation"); + result = result && evaluate_relation.template operator()>("ECCVMWnafRelation"); + result = result && evaluate_relation.template operator()>("ECCVMMSMRelation"); + result = result && evaluate_relation.template operator()>("ECCVMSetRelation"); + + using LookupRelation = ECCVMLookupRelation; + typename ECCVMLookupRelation::SumcheckArrayOfValuesOverSubrelations lookup_result; + for (auto& r : lookup_result) { + r = 0; + } + for (size_t i = 0; i < num_rows; ++i) { + LookupRelation::accumulate(lookup_result, polynomials.get_row(i), params, 1); + } + for (auto r : lookup_result) { + if (r != 0) { + info("Relation ECCVMLookupRelation failed."); + return false; + } + } + return result; +} \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_trace_checker.hpp b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_trace_checker.hpp index 9d416f0fbcf..bf40eec6d8e 100644 --- a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_trace_checker.hpp +++ b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_trace_checker.hpp @@ -1,83 +1,8 @@ #pragma once - +#include "eccvm_circuit_builder.hpp" namespace bb { - class ECCVMTraceChecker { - // bool check_circuit() - // { - // const FF gamma = FF::random_element(); - // const FF beta = FF::random_element(); - // const FF beta_sqr = beta.sqr(); - // const FF beta_cube = beta_sqr * beta; - // auto eccvm_set_permutation_delta = - // gamma * (gamma + beta_sqr) * (gamma + beta_sqr + beta_sqr) * (gamma + beta_sqr + beta_sqr + beta_sqr); - // eccvm_set_permutation_delta = eccvm_set_permutation_delta.invert(); - // bb::RelationParameters params{ - // .eta = 0, - // .beta = beta, - // .gamma = gamma, - // .public_input_delta = 0, - // .lookup_grand_product_delta = 0, - // .beta_sqr = beta_sqr, - // .beta_cube = beta_cube, - // .eccvm_set_permutation_delta = eccvm_set_permutation_delta, - // }; - - // auto polynomials = compute_polynomials(); - // const size_t num_rows = polynomials.get_polynomial_size(); - // compute_logderivative_inverse>(polynomials, params, num_rows); - // compute_permutation_grand_product>(num_rows, polynomials, params); - - // polynomials.z_perm_shift = Polynomial(polynomials.z_perm.shifted()); - - // const auto evaluate_relation = [&](const std::string& relation_name) { - // typename Relation::SumcheckArrayOfValuesOverSubrelations result; - // for (auto& r : result) { - // r = 0; - // } - // constexpr size_t NUM_SUBRELATIONS = result.size(); - - // for (size_t i = 0; i < num_rows; ++i) { - // Relation::accumulate(result, polynomials.get_row(i), params, 1); - - // bool x = true; - // for (size_t j = 0; j < NUM_SUBRELATIONS; ++j) { - // if (result[j] != 0) { - // info("Relation ", relation_name, ", subrelation index ", j, " failed at row ", i); - // x = false; - // } - // } - // if (!x) { - // return false; - // } - // } - // return true; - // }; - - // bool result = true; - // result = - // result && evaluate_relation.template operator()>("ECCVMTranscriptRelation"); - // result = - // result && evaluate_relation.template operator()>("ECCVMPointTableRelation"); - // result = result && evaluate_relation.template operator()>("ECCVMWnafRelation"); - // result = result && evaluate_relation.template operator()>("ECCVMMSMRelation"); - // result = result && evaluate_relation.template operator()>("ECCVMSetRelation"); - - // using LookupRelation = ECCVMLookupRelation; - // typename ECCVMLookupRelation::SumcheckArrayOfValuesOverSubrelations lookup_result; - // for (auto& r : lookup_result) { - // r = 0; - // } - // for (size_t i = 0; i < num_rows; ++i) { - // LookupRelation::accumulate(lookup_result, polynomials.get_row(i), params, 1); - // } - // for (auto r : lookup_result) { - // if (r != 0) { - // info("Relation ECCVMLookupRelation failed."); - // return false; - // } - // } - // return result; - // } - // } -} \ No newline at end of file + public: + static bool check_circuit(ECCVMCircuitBuilder&); +}; +} // namespace bb \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/honk/proof_system/permutation_library.hpp b/barretenberg/cpp/src/barretenberg/honk/proof_system/permutation_library.hpp index e5b22bffe32..a061412d85d 100644 --- a/barretenberg/cpp/src/barretenberg/honk/proof_system/permutation_library.hpp +++ b/barretenberg/cpp/src/barretenberg/honk/proof_system/permutation_library.hpp @@ -1,5 +1,6 @@ #pragma once #include "barretenberg/common/ref_vector.hpp" +#include "barretenberg/common/zip_view.hpp" #include "barretenberg/polynomials/polynomial.hpp" #include "barretenberg/relations/relation_parameters.hpp" #include