Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Revert "make vk metadata actual witnesses" #12534

Merged
merged 1 commit into from
Mar 6, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 2 additions & 4 deletions barretenberg/cpp/src/barretenberg/eccvm/eccvm_flavor.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -112,9 +112,8 @@ class ECCVMFlavor {
* @brief A base class labelling precomputed entities and (ordered) subsets of interest.
* @details Used to build the proving key and verification key.
*/
template <typename DataType_> class PrecomputedEntities {
template <typename DataType_> class PrecomputedEntities : public PrecomputedEntitiesBase {
public:
bool operator==(const PrecomputedEntities& other) const = default;
using DataType = DataType_;
DEFINE_FLAVOR_MEMBERS(DataType,
lagrange_first, // column 0
Expand Down Expand Up @@ -751,9 +750,8 @@ class ECCVMFlavor {
* resolve that, and split out separate PrecomputedPolynomials/Commitments data for clarity but also for
* portability of our circuits.
*/
class VerificationKey : public VerificationKey_<uint64_t, PrecomputedEntities<Commitment>, VerifierCommitmentKey> {
class VerificationKey : public VerificationKey_<PrecomputedEntities<Commitment>, VerifierCommitmentKey> {
public:
bool operator==(const VerificationKey&) const = default;
VerificationKey() = default;
VerificationKey(const size_t circuit_size, const size_t num_public_inputs)
: VerificationKey_(circuit_size, num_public_inputs)
Expand Down
20 changes: 13 additions & 7 deletions barretenberg/cpp/src/barretenberg/flavor/flavor.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,17 @@

namespace bb {

/**
* @brief Base class template containing circuit-specifying data.
*
*/
class PrecomputedEntitiesBase {
public:
bool operator==(const PrecomputedEntitiesBase& other) const = default;
uint64_t circuit_size;
uint64_t log_circuit_size;
uint64_t num_public_inputs;
};
// Specifies the regions of the execution trace containing non-trivial wire values
struct ActiveRegionData {
void add_range(const size_t start, const size_t end)
Expand Down Expand Up @@ -153,23 +164,18 @@ template <typename FF, typename CommitmentKey_> class ProvingKey_ {
/**
* @brief Base verification key class.
*
* @tparam FF_, the type that we will represent our VK metadata (circuit_size, log_circuit_size, num_public_inputs,
* pub_inputs_offset). It will either be uint64_t or a stdlib field type.
* @tparam PrecomputedEntities An instance of PrecomputedEntities_ with affine_element data type and handle type.
* @tparam VerifierCommitmentKey The PCS verification key
*/
template <typename FF_, typename PrecomputedCommitments, typename VerifierCommitmentKey>
template <typename PrecomputedCommitments, typename VerifierCommitmentKey>
class VerificationKey_ : public PrecomputedCommitments {
public:
using FF = typename VerifierCommitmentKey::Curve::ScalarField;
using Commitment = typename VerifierCommitmentKey::Commitment;
std::shared_ptr<VerifierCommitmentKey> pcs_verification_key;
FF_ circuit_size;
FF_ log_circuit_size;
FF_ num_public_inputs;
FF_ pub_inputs_offset = 0;
bool contains_pairing_point_accumulator = false;
PairingPointAccumulatorPubInputIndices pairing_point_accumulator_public_input_indices = {};
uint64_t pub_inputs_offset = 0;

bool operator==(const VerificationKey_&) const = default;
VerificationKey_() = default;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ template <typename BuilderType> class ECCVMRecursiveFlavor_ {
* portability of our circuits.
*/
class VerificationKey
: public VerificationKey_<FF, ECCVMFlavor::PrecomputedEntities<Commitment>, VerifierCommitmentKey> {
: public VerificationKey_<ECCVMFlavor::PrecomputedEntities<Commitment>, VerifierCommitmentKey> {
public:
VerificationKey(const size_t circuit_size, const size_t num_public_inputs)
{
Expand All @@ -108,11 +108,10 @@ template <typename BuilderType> class ECCVMRecursiveFlavor_ {
{
this->pcs_verification_key = std::make_shared<VerifierCommitmentKey>(
builder, native_key->circuit_size, native_key->pcs_verification_key);
this->circuit_size = FF::from_witness(builder, native_key->circuit_size);
// TODO(https://github.com/AztecProtocol/barretenberg/issues/1283): Use stdlib get_msb.
this->log_circuit_size = FF::from_witness(builder, numeric::get_msb(native_key->circuit_size));
this->num_public_inputs = FF::from_witness(builder, native_key->num_public_inputs);
this->pub_inputs_offset = FF::from_witness(builder, native_key->pub_inputs_offset);
this->circuit_size = native_key->circuit_size;
this->log_circuit_size = numeric::get_msb(this->circuit_size);
this->num_public_inputs = native_key->num_public_inputs;
this->pub_inputs_offset = native_key->pub_inputs_offset;

for (auto [native_commitment, commitment] : zip_view(native_key->get_all(), this->get_all())) {
commitment = Commitment::from_witness(builder, native_commitment);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,6 @@ ECCVMRecursiveVerifier_<Flavor>::verify_proof(const ECCVMProof& proof)
commitments.z_perm = transcript->template receive_from_prover<Commitment>(commitment_labels.z_perm);

// Execute Sumcheck Verifier
// TODO(https://github.com/AztecProtocol/barretenberg/issues/1283): Suspicious get_value().
const size_t log_circuit_size = numeric::get_msb(static_cast<uint32_t>(circuit_size.get_value()));
auto sumcheck = SumcheckVerifier<Flavor>(log_circuit_size, transcript);
const FF alpha = transcript->template get_challenge<FF>("Sumcheck:alpha");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,11 +110,9 @@ template <typename RecursiveFlavor> class ECCVMRecursiveTests : public ::testing
}

// Ensure verification key is the same
EXPECT_EQ(static_cast<uint64_t>(verifier.key->circuit_size.get_value()), verification_key->circuit_size);
EXPECT_EQ(static_cast<uint64_t>(verifier.key->log_circuit_size.get_value()),
verification_key->log_circuit_size);
EXPECT_EQ(static_cast<uint64_t>(verifier.key->num_public_inputs.get_value()),
verification_key->num_public_inputs);
EXPECT_EQ(verifier.key->circuit_size, verification_key->circuit_size);
EXPECT_EQ(verifier.key->log_circuit_size, verification_key->log_circuit_size);
EXPECT_EQ(verifier.key->num_public_inputs, verification_key->num_public_inputs);
for (auto [vk_poly, native_vk_poly] : zip_view(verifier.key->get_all(), verification_key->get_all())) {
EXPECT_EQ(vk_poly.get_value(), native_vk_poly);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,8 @@ std::array<typename Flavor::GroupElement, 2> DeciderRecursiveVerifier_<Flavor>::

VerifierCommitments commitments{ accumulator->verification_key, accumulator->witness_commitments };

// TODO(https://github.com/AztecProtocol/barretenberg/issues/1283): fix log_circuit_size usage in stdlib cases.
auto sumcheck = Sumcheck(static_cast<uint32_t>(accumulator->verification_key->log_circuit_size.get_value()),
transcript,
accumulator->target_sum);
auto sumcheck = Sumcheck(
static_cast<size_t>(accumulator->verification_key->log_circuit_size), transcript, accumulator->target_sum);

SumcheckOutput<Flavor> output =
sumcheck.verify(accumulator->relation_parameters, accumulator->alphas, accumulator->gate_challenges);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,27 +47,22 @@ template <typename Flavor> void OinkRecursiveVerifier_<Flavor>::verify()
FF public_input_size = transcript->template receive_from_prover<FF>(domain_separator + "public_input_size");
FF pub_inputs_offset = transcript->template receive_from_prover<FF>(domain_separator + "pub_inputs_offset");

if (static_cast<uint32_t>(circuit_size.get_value()) !=
static_cast<uint32_t>(verification_key->verification_key->circuit_size.get_value())) {
if (static_cast<uint32_t>(circuit_size.get_value()) != verification_key->verification_key->circuit_size) {
throw_or_abort("OinkRecursiveVerifier::verify: proof circuit size does not match verification key");
}
if (static_cast<uint32_t>(public_input_size.get_value()) !=
static_cast<uint32_t>(verification_key->verification_key->num_public_inputs.get_value())) {
const std::string message =
"OinkRecursiveVerifier::verify: proof public input size (" +
std::to_string(static_cast<uint32_t>(public_input_size.get_value())) +
") does not match verification key public input size (" +
std::to_string(static_cast<uint32_t>(verification_key->verification_key->num_public_inputs.get_value())) +
")";
if (static_cast<uint32_t>(public_input_size.get_value()) != verification_key->verification_key->num_public_inputs) {
const std::string message = "OinkRecursiveVerifier::verify: proof public input size (" +
std::to_string(static_cast<uint32_t>(public_input_size.get_value())) +
") does not match verification key public input size (" +
std::to_string(verification_key->verification_key->num_public_inputs) + ")";
throw_or_abort(message);
}
if (static_cast<uint32_t>(pub_inputs_offset.get_value()) !=
static_cast<uint32_t>(verification_key->verification_key->pub_inputs_offset.get_value())) {
if (static_cast<uint32_t>(pub_inputs_offset.get_value()) != verification_key->verification_key->pub_inputs_offset) {
throw_or_abort("OinkRecursiveVerifier::verify: proof public input offset does not match verification key");
}

std::vector<FF> public_inputs;
for (size_t i = 0; i < static_cast<size_t>(static_cast<uint32_t>(public_input_size.get_value())); ++i) {
for (size_t i = 0; i < verification_key->verification_key->num_public_inputs; ++i) {
public_inputs.emplace_back(
transcript->template receive_from_prover<FF>(domain_separator + "public_input_" + std::to_string(i)));
}
Expand Down Expand Up @@ -114,13 +109,12 @@ template <typename Flavor> void OinkRecursiveVerifier_<Flavor>::verify()
}
}

// TODO(https://github.com/AztecProtocol/barretenberg/issues/1283): Suspicious get_value().
const FF public_input_delta = compute_public_input_delta<Flavor>(
public_inputs,
beta,
gamma,
circuit_size,
static_cast<uint32_t>(verification_key->verification_key->pub_inputs_offset.get_value()));
static_cast<uint32_t>(verification_key->verification_key->pub_inputs_offset));

// Get commitment to permutation and lookup grand products
commitments.z_perm = transcript->template receive_from_prover<Commitment>(domain_separator + labels.z_perm);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,8 +104,7 @@ UltraRecursiveVerifier_<Flavor>::Output UltraRecursiveVerifier_<Flavor>::verify_

// Execute Sumcheck Verifier and extract multivariate opening point u = (u_0, ..., u_{d-1}) and purported
// multivariate evaluations at u
// TODO(https://github.com/AztecProtocol/barretenberg/issues/1283): Suspicious get_value().
const size_t log_circuit_size = numeric::get_msb(static_cast<uint32_t>(key->circuit_size.get_value()));
const size_t log_circuit_size = numeric::get_msb(static_cast<uint32_t>(key->circuit_size));
auto sumcheck = Sumcheck(log_circuit_size, transcript);

// Receive commitments to Libra masking polynomials
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,9 +128,9 @@ template <typename RecursiveFlavor> class RecursiveVerifierTest : public testing
RecursiveVerifier verifier{ &outer_circuit, honk_vk };

// Spot check some values in the recursive VK to ensure it was constructed correctly
EXPECT_EQ(static_cast<uint64_t>(verifier.key->circuit_size.get_value()), honk_vk->circuit_size);
EXPECT_EQ(static_cast<uint64_t>(verifier.key->log_circuit_size.get_value()), honk_vk->log_circuit_size);
EXPECT_EQ(static_cast<uint64_t>(verifier.key->num_public_inputs.get_value()), honk_vk->num_public_inputs);
EXPECT_EQ(verifier.key->circuit_size, honk_vk->circuit_size);
EXPECT_EQ(verifier.key->log_circuit_size, honk_vk->log_circuit_size);
EXPECT_EQ(verifier.key->num_public_inputs, honk_vk->num_public_inputs);
for (auto [vk_poly, native_vk_poly] : zip_view(verifier.key->get_all(), honk_vk->get_all())) {
EXPECT_EQ(vk_poly.get_value(), native_vk_poly);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,13 +100,12 @@ template <IsRecursiveFlavor Flavor> class RecursiveDeciderVerificationKey_ {
*/
DeciderVerificationKey get_value()
{
auto native_honk_vk = std::make_shared<NativeVerificationKey>(
static_cast<uint64_t>(verification_key->circuit_size.get_value()),
static_cast<uint64_t>(verification_key->num_public_inputs.get_value()));
auto native_honk_vk = std::make_shared<NativeVerificationKey>(verification_key->circuit_size,
verification_key->num_public_inputs);
native_honk_vk->pcs_verification_key = verification_key->pcs_verification_key == nullptr
? std::make_shared<VerifierCommitmentKey>()
: verification_key->pcs_verification_key;
native_honk_vk->pub_inputs_offset = static_cast<uint64_t>(verification_key->pub_inputs_offset.get_value());
native_honk_vk->pub_inputs_offset = verification_key->pub_inputs_offset;
native_honk_vk->contains_pairing_point_accumulator = verification_key->contains_pairing_point_accumulator;
native_honk_vk->pairing_point_accumulator_public_input_indices =
verification_key->pairing_point_accumulator_public_input_indices;
Expand All @@ -121,8 +120,7 @@ template <IsRecursiveFlavor Flavor> class RecursiveDeciderVerificationKey_ {
DeciderVerificationKey decider_vk(native_honk_vk);
decider_vk.is_accumulator = is_accumulator;

decider_vk.public_inputs = std::vector<NativeFF>(
static_cast<size_t>(static_cast<uint32_t>(verification_key->num_public_inputs.get_value())));
decider_vk.public_inputs = std::vector<NativeFF>(static_cast<size_t>(verification_key->num_public_inputs));
for (auto [public_input, inst_public_input] : zip_view(public_inputs, decider_vk.public_inputs)) {
inst_public_input = public_input.get_value();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,8 @@ template <IsRecursiveFlavor Flavor_, size_t NUM_> struct RecursiveDeciderVerific
{
size_t max_log_circuit_size{ 0 };
for (auto key : _data) {
// TODO(https://github.com/AztecProtocol/barretenberg/issues/1283): Suspicious get_value.
max_log_circuit_size = std::max(
max_log_circuit_size,
static_cast<size_t>(static_cast<uint32_t>(key->verification_key->log_circuit_size.get_value())));
max_log_circuit_size =
std::max(max_log_circuit_size, static_cast<size_t>(key->verification_key->log_circuit_size));
}
return max_log_circuit_size;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ template <typename BuilderType> class TranslatorRecursiveFlavor_ {
* portability of our circuits.
*/
class VerificationKey
: public VerificationKey_<FF, TranslatorFlavor::PrecomputedEntities<Commitment>, VerifierCommitmentKey> {
: public VerificationKey_<TranslatorFlavor::PrecomputedEntities<Commitment>, VerifierCommitmentKey> {
public:
VerificationKey(const size_t circuit_size, const size_t num_public_inputs)
{
Expand All @@ -105,11 +105,10 @@ template <typename BuilderType> class TranslatorRecursiveFlavor_ {
VerificationKey(CircuitBuilder* builder, const std::shared_ptr<NativeVerificationKey>& native_key)
{
this->pcs_verification_key = std::make_shared<VerifierCommitmentKey>(); // ?
this->circuit_size = FF::from_witness(builder, native_key->circuit_size);
// TODO(https://github.com/AztecProtocol/barretenberg/issues/1283): Use stdlib get_msb.
this->log_circuit_size = numeric::get_msb(native_key->circuit_size);
this->num_public_inputs = FF::from_witness(builder, native_key->num_public_inputs);
this->pub_inputs_offset = FF::from_witness(builder, native_key->pub_inputs_offset);
this->circuit_size = native_key->circuit_size;
this->log_circuit_size = numeric::get_msb(this->circuit_size);
this->num_public_inputs = native_key->num_public_inputs;
this->pub_inputs_offset = native_key->pub_inputs_offset;

for (auto [native_comm, comm] : zip_view(native_key->get_all(), this->get_all())) {
comm = Commitment::from_witness(builder, native_comm);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ std::array<typename Flavor::GroupElement, 2> TranslatorRecursiveVerifier_<Flavor
CommitmentLabels commitment_labels;

const FF circuit_size = transcript->template receive_from_prover<FF>("circuit_size");
if (static_cast<uint32_t>(circuit_size.get_value()) != static_cast<uint32_t>(key->circuit_size.get_value())) {
if (static_cast<uint32_t>(circuit_size.get_value()) != key->circuit_size) {
throw_or_abort(
"TranslatorRecursiveVerifier::verify_proof: proof circuit size does not match verification key!");
}
Expand All @@ -104,7 +104,6 @@ std::array<typename Flavor::GroupElement, 2> TranslatorRecursiveVerifier_<Flavor
commitments.z_perm = transcript->template receive_from_prover<Commitment>(commitment_labels.z_perm);

// Execute Sumcheck Verifier
// TODO(https://github.com/AztecProtocol/barretenberg/issues/1283): Suspicious get_value().
const size_t log_circuit_size = numeric::get_msb(static_cast<uint32_t>(circuit_size.get_value()));
auto sumcheck = Sumcheck(log_circuit_size, transcript);
FF alpha = transcript->template get_challenge<FF>("Sumcheck:alpha");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,11 +108,9 @@ template <typename RecursiveFlavor> class TranslatorRecursiveTests : public ::te
<< "Recursive Verifier/Verifier manifest discrepency in round " << i;
}

EXPECT_EQ(static_cast<uint64_t>(verifier.key->circuit_size.get_value()), verification_key->circuit_size);
EXPECT_EQ(static_cast<uint64_t>(verifier.key->log_circuit_size.get_value()),
verification_key->log_circuit_size);
EXPECT_EQ(static_cast<uint64_t>(verifier.key->num_public_inputs.get_value()),
verification_key->num_public_inputs);
EXPECT_EQ(verifier.key->circuit_size, verification_key->circuit_size);
EXPECT_EQ(verifier.key->log_circuit_size, verification_key->log_circuit_size);
EXPECT_EQ(verifier.key->num_public_inputs, verification_key->num_public_inputs);
for (auto [vk_poly, native_vk_poly] : zip_view(verifier.key->get_all(), verification_key->get_all())) {
EXPECT_EQ(vk_poly.get_value(), native_vk_poly);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ class MegaFlavor {
* @brief A base class labelling precomputed entities and (ordered) subsets of interest.
* @details Used to build the proving key and verification key.
*/
template <typename DataType_> class PrecomputedEntities {
template <typename DataType_> class PrecomputedEntities : public PrecomputedEntitiesBase {
public:
bool operator==(const PrecomputedEntities&) const = default;
using DataType = DataType_;
Expand Down Expand Up @@ -429,7 +429,7 @@ class MegaFlavor {
* circuits.
* @todo TODO(https://github.com/AztecProtocol/barretenberg/issues/876)
*/
class VerificationKey : public VerificationKey_<uint64_t, PrecomputedEntities<Commitment>, VerifierCommitmentKey> {
class VerificationKey : public VerificationKey_<PrecomputedEntities<Commitment>, VerifierCommitmentKey> {
public:
// Data pertaining to transfer of databus return data via public inputs of the proof being recursively verified
DatabusPropagationData databus_propagation_data;
Expand Down
Loading