Skip to content

Commit

Permalink
fix: Revert "make vk metadata actual witnesses" (#12534)
Browse files Browse the repository at this point in the history
  • Loading branch information
ludamad authored Mar 6, 2025
1 parent 2e0d791 commit ed46a3c
Show file tree
Hide file tree
Showing 31 changed files with 124 additions and 146 deletions.
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

0 comments on commit ed46a3c

Please sign in to comment.