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

feat: Protogalaxy constructor from a verification key #4111

Closed
wants to merge 8 commits into from
Closed
Changes from 1 commit
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
Prev Previous commit
Next Next commit
Remove vk computation from xray
codygunton committed Jan 12, 2024
commit 0d19aaa76e5e287e2574c7eb85aaab2b441889c8
Original file line number Diff line number Diff line change
@@ -24,7 +24,7 @@ void fold_one(State& state) noexcept
const auto construct_instance = [&]() {
Builder builder;
bench_utils::generate_basic_arithmetic_circuit(builder, log2_num_gates);
return composer.create_instance(builder);
return composer.create_prover_instance(builder);
};

std::shared_ptr<Instance> instance_1 = construct_instance();
Original file line number Diff line number Diff line change
@@ -174,7 +174,8 @@ inline proof_system::honk::UltraProver get_prover(
{
proof_system::honk::UltraComposer::CircuitBuilder builder;
test_circuit_function(builder, num_iterations);
std::shared_ptr<proof_system::honk::UltraComposer::Instance> instance = composer.create_instance(builder);
std::shared_ptr<proof_system::honk::UltraComposer::ProverInstance> instance =
composer.create_prover_instance(builder);
return composer.create_prover(instance);
}

4 changes: 2 additions & 2 deletions barretenberg/cpp/src/barretenberg/goblin/goblin.hpp
Original file line number Diff line number Diff line change
@@ -104,7 +104,7 @@ class Goblin {

// Construct a Honk proof for the main circuit
GoblinUltraComposer composer;
auto instance = composer.create_instance(circuit_builder);
auto instance = composer.create_prover_instance(circuit_builder);
auto prover = composer.create_prover(instance);
auto ultra_proof = prover.construct_proof();

@@ -174,7 +174,7 @@ class Goblin {

// Construct a Honk proof for the main circuit
GoblinUltraComposer composer;
auto instance = composer.create_instance(circuit_builder);
auto instance = composer.create_prover_instance(circuit_builder);
auto prover = composer.create_prover(instance);
auto ultra_proof = prover.construct_proof();

Original file line number Diff line number Diff line change
@@ -57,12 +57,6 @@ template <UltraFlavor Flavor> void DeciderProver_<Flavor>::execute_preamble_roun
for (size_t idx = 0; idx < witness_labels.size(); idx++) {
transcript->send_to_verifier(witness_labels[idx], comm_view[idx]);
}

auto vk_view = accumulator->verification_key->get_all();
auto vk_labels = accumulator->commitment_labels.get_precomputed();
for (size_t idx = 0; idx < vk_labels.size(); idx++) {
transcript->send_to_verifier(vk_labels[idx], vk_view[idx]);
}
}

/**
Original file line number Diff line number Diff line change
@@ -59,11 +59,6 @@ void ProtoGalaxyProver_<ProverInstances>::finalise_and_send_instance(std::shared
for (size_t idx = 0; idx < NUM_SUBRELATIONS - 1; idx++) {
instance->alphas[idx] = transcript->get_challenge(domain_separator + "_alpha_" + std::to_string(idx));
}
auto vk_view = instance->verification_key->get_all();
auto labels = instance->commitment_labels.get_precomputed();
for (size_t idx = 0; idx < labels.size(); idx++) {
transcript->send_to_verifier(domain_separator + "_" + labels[idx], vk_view[idx]);
}
}

template <class ProverInstances>
@@ -103,12 +98,6 @@ void ProtoGalaxyProver_<ProverInstances>::send_accumulator(std::shared_ptr<Insta
for (size_t idx = 0; idx < witness_labels.size(); idx++) {
transcript->send_to_verifier(domain_separator + "_" + witness_labels[idx], comm_view[idx]);
}

auto vk_view = instance->verification_key->get_all();
auto vk_labels = instance->commitment_labels.get_precomputed();
for (size_t idx = 0; idx < vk_labels.size(); idx++) {
transcript->send_to_verifier(domain_separator + "_" + vk_labels[idx], vk_view[idx]);
}
}

template <class ProverInstances> void ProtoGalaxyProver_<ProverInstances>::prepare_for_folding()
@@ -250,22 +239,6 @@ std::shared_ptr<typename ProverInstances::Instance> ProtoGalaxyProver_<ProverIns
folded_relation_parameters.lookup_grand_product_delta);
next_accumulator->relation_parameters = folded_relation_parameters;

// Fold the verification key and send it to the verifier as this is part of ϕ as well
auto acc_vk = std::make_shared<VerificationKey>(instances[0]->prover_polynomials.get_polynomial_size(),
instances[0]->public_inputs.size());
auto labels = next_accumulator->commitment_labels.get_precomputed();
size_t vk_idx = 0;
for (auto& vk : acc_vk->get_all()) {
size_t inst = 0;
vk = Commitment::infinity();
for (auto& instance : instances) {
vk = vk + (instance->verification_key->get_all()[vk_idx]) * lagranges[inst];
inst++;
}
transcript->send_to_verifier("next_" + labels[vk_idx], vk);
vk_idx++;
}
next_accumulator->verification_key = acc_vk;
return next_accumulator;
}

Original file line number Diff line number Diff line change
@@ -25,7 +25,6 @@ template <class ProverInstances_> class ProtoGalaxyProver_ {
using Relations = typename Flavor::Relations;
using RelationSeparator = typename Flavor::RelationSeparator;
using CombinedRelationSeparator = typename ProverInstances::RelationSeparator;
using VerificationKey = typename Flavor::VerificationKey;
using CommitmentKey = typename Flavor::CommitmentKey;
using WitnessCommitments = typename Flavor::WitnessCommitments;
using Commitment = typename Flavor::Commitment;
Original file line number Diff line number Diff line change
@@ -151,7 +151,7 @@ template <typename BuilderType> class GoblinRecursiveVerifierTest : public testi

// Compute native verification key
InnerComposer inner_composer;
auto instance = inner_composer.create_instance(inner_circuit);
auto instance = inner_composer.create_prover_instance(inner_circuit);
auto prover = inner_composer.create_prover(instance); // A prerequisite for computing VK

// Instantiate the recursive verifier using the native verification key
@@ -179,7 +179,7 @@ template <typename BuilderType> class GoblinRecursiveVerifierTest : public testi

// Generate a proof over the inner circuit
InnerComposer inner_composer;
auto instance = inner_composer.create_instance(inner_circuit);
auto instance = inner_composer.create_prover_instance(inner_circuit);
auto inner_prover = inner_composer.create_prover(instance);
auto inner_proof = inner_prover.construct_proof();

@@ -211,7 +211,7 @@ template <typename BuilderType> class GoblinRecursiveVerifierTest : public testi
// Check 3: Construct and verify a proof of the recursive verifier circuit
{
auto composer = get_outer_composer<OuterBuilder>();
auto instance = composer.create_instance(outer_circuit);
auto instance = composer.create_prover_instance(outer_circuit);
auto prover = composer.create_prover(instance);
auto verifier = composer.create_verifier(instance);
auto proof = prover.construct_proof();
@@ -234,7 +234,7 @@ template <typename BuilderType> class GoblinRecursiveVerifierTest : public testi

// Generate a proof over the inner circuit
InnerComposer inner_composer;
auto instance = inner_composer.create_instance(inner_circuit);
auto instance = inner_composer.create_prover_instance(inner_circuit);
auto inner_prover = inner_composer.create_prover(instance);
auto inner_proof = inner_prover.construct_proof();

Original file line number Diff line number Diff line change
@@ -81,7 +81,7 @@ class RecursiveMergeVerifierTest : public testing::Test {
// Check 3: Construct and verify a (goblin) ultra honk proof of the Merge recursive verifier circuit
{
GoblinUltraComposer composer;
auto instance = composer.create_instance(outer_circuit);
auto instance = composer.create_prover_instance(outer_circuit);
auto prover = composer.create_prover(instance);
auto verifier = composer.create_verifier(instance);
auto proof = prover.construct_proof();
Original file line number Diff line number Diff line change
@@ -134,7 +134,7 @@ template <typename BuilderType> class RecursiveVerifierTest : public testing::Te

// Compute native verification key
InnerComposer inner_composer;
auto instance = inner_composer.create_instance(inner_circuit);
auto instance = inner_composer.create_prover_instance(inner_circuit);
auto prover = inner_composer.create_prover(instance); // A prerequisite for computing VK

// Instantiate the recursive verifier using the native verification key
@@ -162,7 +162,7 @@ template <typename BuilderType> class RecursiveVerifierTest : public testing::Te

// Generate a proof over the inner circuit
InnerComposer inner_composer;
auto instance = inner_composer.create_instance(inner_circuit);
auto instance = inner_composer.create_prover_instance(inner_circuit);
auto inner_prover = inner_composer.create_prover(instance);
auto inner_proof = inner_prover.construct_proof();

@@ -194,7 +194,7 @@ template <typename BuilderType> class RecursiveVerifierTest : public testing::Te
// Check 3: Construct and verify a proof of the recursive verifier circuit
{
auto composer = get_outer_composer<OuterBuilder>();
auto instance = composer.create_instance(outer_circuit);
auto instance = composer.create_prover_instance(outer_circuit);
auto prover = composer.create_prover(instance);
auto verifier = composer.create_verifier(instance);
auto proof = prover.construct_proof();
@@ -218,7 +218,7 @@ template <typename BuilderType> class RecursiveVerifierTest : public testing::Te

// Generate a proof over the inner circuit
InnerComposer inner_composer;
auto instance = inner_composer.create_instance(inner_circuit);
auto instance = inner_composer.create_prover_instance(inner_circuit);
auto inner_prover = inner_composer.create_prover(instance);
auto inner_proof = inner_prover.construct_proof();

Original file line number Diff line number Diff line change
@@ -19,7 +19,6 @@ namespace proof_system::honk {
template <class Flavor> class ProverInstance_ {
using Circuit = typename Flavor::CircuitBuilder;
using ProvingKey = typename Flavor::ProvingKey;
using VerificationKey = typename Flavor::VerificationKey;
using CommitmentKey = typename Flavor::CommitmentKey;
using FF = typename Flavor::FF;
using ProverPolynomials = typename Flavor::ProverPolynomials;
@@ -30,7 +29,6 @@ template <class Flavor> class ProverInstance_ {

public:
std::shared_ptr<ProvingKey> proving_key;
std::shared_ptr<VerificationKey> verification_key;

ProverPolynomials prover_polynomials;
WitnessCommitments witness_commitments;
Original file line number Diff line number Diff line change
@@ -87,7 +87,7 @@ TEST_F(DataBusComposerTests, CallDataRead)
auto composer = GoblinUltraComposer();

// Construct and verify Honk proof
auto instance = composer.create_instance(builder);
auto instance = composer.create_prover_instance(builder);
// For debugging, use "instance_inspector::print_databus_info(instance)"
auto prover = composer.create_prover(instance);
auto verifier = composer.create_verifier(instance);
Original file line number Diff line number Diff line change
@@ -61,7 +61,7 @@ class GoblinUltraHonkComposerTests : public ::testing::Test {
*/
bool construct_and_verify_honk_proof(auto& composer, auto& builder)
{
auto instance = composer.create_instance(builder);
auto instance = composer.create_prover_instance(builder);
auto prover = composer.create_prover(instance);
auto verifier = composer.create_verifier(instance);
auto proof = prover.construct_proof();
Original file line number Diff line number Diff line change
@@ -145,7 +145,7 @@ TEST_F(GoblinUltraTranscriptTests, ProverManifestConsistency)

// Automatically generate a transcript manifest by constructing a proof
auto composer = GoblinUltraComposer();
auto instance = composer.create_instance(builder);
auto instance = composer.create_prover_instance(builder);
auto prover = composer.create_prover(instance);
auto proof = prover.construct_proof();

@@ -172,7 +172,7 @@ TEST_F(GoblinUltraTranscriptTests, VerifierManifestConsistency)

// Automatically generate a transcript manifest in the prover by constructing a proof
auto composer = GoblinUltraComposer();
auto instance = composer.create_instance(builder);
auto instance = composer.create_prover_instance(builder);
auto prover = composer.create_prover(instance);
auto proof = prover.construct_proof();

@@ -223,7 +223,7 @@ TEST_F(GoblinUltraTranscriptTests, StructureTest)

// Automatically generate a transcript manifest by constructing a proof
auto composer = GoblinUltraComposer();
auto instance = composer.create_instance(builder);
auto instance = composer.create_prover_instance(builder);
auto prover = composer.create_prover(instance);
auto proof = prover.construct_proof();
auto verifier = composer.create_verifier(instance);
20 changes: 10 additions & 10 deletions barretenberg/cpp/src/barretenberg/ultra_honk/protogalaxy.test.cpp
Original file line number Diff line number Diff line change
@@ -105,7 +105,7 @@ TEST_F(ProtoGalaxyTests, FullHonkEvaluationsValidCircuit)
builder.create_add_gate({ a_idx, b_idx, c_idx, 1, 1, -1, 0 });

auto composer = UltraComposer();
auto instance = composer.create_instance(builder);
auto instance = composer.create_prover_instance(builder);
instance->initialize_prover_polynomials();

auto eta = FF::random_element();
@@ -266,20 +266,20 @@ TEST_F(ProtoGalaxyTests, FullProtogalaxyTest)
auto builder_1 = typename Flavor::CircuitBuilder();
builder_1.add_public_variable(FF(1));

auto instance_1 = composer.create_instance(builder_1);
auto instance_1 = composer.create_prover_instance(builder_1);

auto builder_2 = typename Flavor::CircuitBuilder();
builder_2.add_public_variable(FF(1));

auto instance_2 = composer.create_instance(builder_2);
auto instance_2 = composer.create_prover_instance(builder_2);

auto instances = std::vector<std::shared_ptr<Instance>>{ instance_1, instance_2 };
auto first_accumulator = fold_and_verify(instances, composer, true);
check_accumulator_target_sum_manual(first_accumulator, true);

auto builder_3 = typename Flavor::CircuitBuilder();
builder_3.add_public_variable(FF(1));
auto instance_3 = composer.create_instance(builder_3);
auto instance_3 = composer.create_prover_instance(builder_3);

instances = std::vector<std::shared_ptr<Instance>>{ first_accumulator, instance_3 };
auto second_accumulator = fold_and_verify(instances, composer, true);
@@ -295,20 +295,20 @@ TEST_F(ProtoGalaxyTests, TamperedCommitment)
auto builder_1 = typename Flavor::CircuitBuilder();
builder_1.add_public_variable(FF(1));

auto instance_1 = composer.create_instance(builder_1);
auto instance_1 = composer.create_prover_instance(builder_1);

auto builder_2 = typename Flavor::CircuitBuilder();
builder_2.add_public_variable(FF(1));

auto instance_2 = composer.create_instance(builder_2);
auto instance_2 = composer.create_prover_instance(builder_2);

auto instances = std::vector<std::shared_ptr<Instance>>{ instance_1, instance_2 };
auto first_accumulator = fold_and_verify(instances, composer, true);
check_accumulator_target_sum_manual(first_accumulator, true);

auto builder_3 = typename Flavor::CircuitBuilder();
builder_3.add_public_variable(FF(1));
auto instance_3 = composer.create_instance(builder_3);
auto instance_3 = composer.create_prover_instance(builder_3);

// tampering with the commitment should cause the decider to fail
first_accumulator->witness_commitments.w_l = Projective(Affine::random_element());
@@ -326,20 +326,20 @@ TEST_F(ProtoGalaxyTests, TamperedAccumulatorPolynomial)
auto builder_1 = typename Flavor::CircuitBuilder();
builder_1.add_public_variable(FF(1));

auto instance_1 = composer.create_instance(builder_1);
auto instance_1 = composer.create_prover_instance(builder_1);

auto builder_2 = typename Flavor::CircuitBuilder();
builder_2.add_public_variable(FF(1));

auto instance_2 = composer.create_instance(builder_2);
auto instance_2 = composer.create_prover_instance(builder_2);

auto instances = std::vector<std::shared_ptr<Instance>>{ instance_1, instance_2 };
auto first_accumulator = fold_and_verify(instances, composer, true);
check_accumulator_target_sum_manual(first_accumulator, true);

auto builder_3 = typename Flavor::CircuitBuilder();
builder_3.add_public_variable(FF(1));
auto instance_3 = composer.create_instance(builder_3);
auto instance_3 = composer.create_prover_instance(builder_3);

// tampering with accumulator's polynomial should cause both folding and deciding to fail
instances = std::vector<std::shared_ptr<Instance>>{ first_accumulator, instance_3 };
Original file line number Diff line number Diff line change
@@ -269,7 +269,7 @@ TEST_F(RelationCorrectnessTests, UltraRelationCorrectness)

// Create a prover (it will compute proving key and witness)
auto composer = UltraComposer();
auto instance = composer.create_instance(builder);
auto instance = composer.create_prover_instance(builder);
auto proving_key = instance->proving_key;
auto circuit_size = proving_key->circuit_size;

@@ -322,7 +322,7 @@ TEST_F(RelationCorrectnessTests, GoblinUltraRelationCorrectness)

// Create a prover (it will compute proving key and witness)
auto composer = GoblinUltraComposer();
auto instance = composer.create_instance(builder);
auto instance = composer.create_prover_instance(builder);
auto proving_key = instance->proving_key;
auto circuit_size = proving_key->circuit_size;

Original file line number Diff line number Diff line change
@@ -150,7 +150,7 @@ TEST_F(SumcheckTestsRealCircuit, Ultra)

// Create a prover (it will compute proving key and witness)
auto composer = UltraComposer();
auto instance = composer.create_instance(builder);
auto instance = composer.create_prover_instance(builder);

// Generate eta, beta and gamma
FF eta = FF::random_element();
Loading