Skip to content

Commit 0dc65b8

Browse files
committed
Fixing AVM origin tag issues
1 parent 9882425 commit 0dc65b8

File tree

9 files changed

+70
-15
lines changed

9 files changed

+70
-15
lines changed

barretenberg/cpp/src/barretenberg/vm2/avm_api.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ std::pair<AvmAPI::AvmProof, AvmAPI::AvmVerificationKey> AvmAPI::prove(const AvmA
2626
// Prove.
2727
info("Proving...");
2828
AvmProvingHelper proving_helper;
29-
auto [proof, vk] = AVM_TRACK_TIME_V("proving/all", proving_helper.prove(std::move(trace)));
29+
auto [proof, vk] =
30+
AVM_TRACK_TIME_V("proving/all", proving_helper.prove(std::move(trace), inputs.publicInputs.to_columns()));
3031

3132
info("Done!");
3233
return { std::move(proof), std::move(vk) };

barretenberg/cpp/src/barretenberg/vm2/constraining/prover.cpp

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,20 @@ void AvmProver::execute_preamble_round()
4646
info("AVM vk hash in prover: ", vk_hash);
4747
}
4848

49+
/**
50+
* @brief Add public inputs to transcript
51+
*
52+
*/
53+
void AvmProver::execute_public_inputs_round(const std::vector<std::vector<FF>>& public_inputs_cols)
54+
{
55+
for (size_t i = 0; i < public_inputs_cols.size(); ++i) {
56+
for (size_t j = 0; j < AVM_PUBLIC_INPUTS_COLUMNS_MAX_LENGTH; ++j) {
57+
// The public inputs are added to the hash buffer, but do not increase the size of the proof
58+
transcript->add_to_hash_buffer("public_input_" + std::to_string(i) + "_" + std::to_string(j),
59+
j < public_inputs_cols[i].size() ? public_inputs_cols[i][j] : FF(0));
60+
}
61+
}
62+
}
4963
/**
5064
* @brief Compute commitments to all of the witness wires (apart from the logderivative inverse wires)
5165
*
@@ -141,11 +155,14 @@ HonkProof AvmProver::export_proof()
141155
return transcript->export_proof();
142156
}
143157

144-
HonkProof AvmProver::construct_proof()
158+
HonkProof AvmProver::construct_proof(const std::vector<std::vector<FF>>& public_inputs_cols)
145159
{
146160
// Add circuit size public input size and public inputs to transcript.
147161
execute_preamble_round();
148162

163+
// Add public inputs to transcript.
164+
AVM_TRACK_TIME("prove/public_inputs_round", execute_public_inputs_round(public_inputs_cols));
165+
149166
// Compute wire commitments.
150167
AVM_TRACK_TIME("prove/wire_commitments_round", execute_wire_commitments_round());
151168

barretenberg/cpp/src/barretenberg/vm2/constraining/prover.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,15 @@ class AvmProver {
3131
// Note: all the following methods are virtual to allow Avm2 to tweak the behaviour.
3232
// We can remove this once the transition is done.
3333
virtual void execute_preamble_round();
34+
virtual void execute_public_inputs_round(const std::vector<std::vector<FF>>& public_inputs_cols);
3435
virtual void execute_wire_commitments_round();
3536
virtual void execute_log_derivative_inverse_round();
3637
virtual void execute_log_derivative_inverse_commitments_round();
3738
virtual void execute_relation_check_rounds();
3839
virtual void execute_pcs_rounds();
3940

4041
virtual HonkProof export_proof();
41-
virtual HonkProof construct_proof();
42+
virtual HonkProof construct_proof(const std::vector<std::vector<FF>>& public_inputs_cols);
4243

4344
std::shared_ptr<Transcript> transcript = std::make_shared<Transcript>();
4445

barretenberg/cpp/src/barretenberg/vm2/constraining/recursion/recursive_verifier.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,21 +83,43 @@ AvmRecursiveVerifier::PairingPoints AvmRecursiveVerifier::verify_proof(
8383
// TODO(#14234)[Unconditional PIs validation]: Remove the next 3 lines
8484
StdlibProof stdlib_proof = stdlib_proof_with_pi_flag;
8585
bool_t<Builder> pi_validation = !bool_t<Builder>(stdlib_proof.at(0));
86+
// TODO(https://github.com/AztecProtocol/aztec-packages/issues/16716) Origin Tag security mechanism is screaming
87+
// that there is a free witness affecting proof verificaton. Because it is and this bool allows completely disabling
88+
// public input logic. So this has to be removed in the future.
89+
pi_validation.unset_free_witness_tag();
8690
stdlib_proof.erase(stdlib_proof.begin());
8791

8892
if (public_inputs.size() != AVM_NUM_PUBLIC_INPUT_COLUMNS) {
8993
throw_or_abort("AvmRecursiveVerifier::verify_proof: public inputs size mismatch");
9094
}
95+
for (const auto& public_input : public_inputs) {
96+
if (public_input.size() != AVM_PUBLIC_INPUTS_COLUMNS_MAX_LENGTH) {
97+
throw_or_abort("AvmRecursiveVerifier::verify_proof: public input size mismatch");
98+
}
99+
}
91100

92101
transcript->load_proof(stdlib_proof);
93102

94103
// TODO(#15892): Fiat-Shamir the vk hash by uncommenting the add_to_hash_buffer.
95104
// transcript->add_to_hash_buffer("avm_vk_hash", vk_hash);
105+
// TODO(https://github.com/AztecProtocol/aztec-packages/issues/16716) For now we are unsetting the free witness tags
106+
// to stop triggering the Origin Tag security mechanism, but the problem is that the VK is not hashed.
107+
for (auto& comm : key->get_all()) {
108+
comm.unset_free_witness_tag();
109+
}
110+
96111
info("AVM vk hash in recursive verifier: ", vk_hash);
97112

98113
RelationParams relation_parameters;
99114
VerifierCommitments commitments{ key };
100115

116+
// Add public inputs to transcript
117+
for (size_t i = 0; i < AVM_NUM_PUBLIC_INPUT_COLUMNS; i++) {
118+
for (size_t j = 0; j < public_inputs[i].size(); j++) {
119+
transcript->add_to_hash_buffer("public_input_" + std::to_string(i) + "_" + std::to_string(j),
120+
public_inputs[i][j]);
121+
}
122+
}
101123
// Get commitments to VM wires
102124
for (auto [comm, label] : zip_view(commitments.get_wires(), commitments.get_wires_labels())) {
103125
comm = transcript->template receive_from_prover<Commitment>(label);

barretenberg/cpp/src/barretenberg/vm2/constraining/recursion/recursive_verifier.test.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,13 @@ class AvmRecursiveTests : public ::testing::Test {
4141
{
4242
auto [trace, public_inputs] = testing::get_minimal_trace_with_pi();
4343

44+
const auto public_inputs_cols = public_inputs.to_columns();
45+
4446
InnerProver prover;
45-
const auto [proof, vk_data] = prover.prove(std::move(trace));
47+
const auto [proof, vk_data] = prover.prove(std::move(trace), public_inputs_cols);
4648
const auto verification_key = InnerProver::create_verification_key(vk_data);
4749
InnerVerifier verifier(verification_key);
4850

49-
const auto public_inputs_cols = public_inputs.to_columns();
5051
const bool verified = verifier.verify_proof(proof, public_inputs_cols);
5152

5253
// Should be in principle ASSERT_TRUE, but compiler does not like it.

barretenberg/cpp/src/barretenberg/vm2/constraining/verifier.cpp

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,22 @@ bool AvmVerifier::verify_proof(const HonkProof& proof, const std::vector<std::ve
6060
// transcript->add_to_hash_buffer("avm_vk_hash", vk_hash);
6161
info("AVM vk hash in verifier: ", vk_hash);
6262

63+
// Check public inputs size.
64+
if (public_inputs.size() != AVM_NUM_PUBLIC_INPUT_COLUMNS) {
65+
vinfo("Public inputs size mismatch");
66+
return false;
67+
}
68+
// Public inputs from proof
69+
for (size_t i = 0; i < AVM_NUM_PUBLIC_INPUT_COLUMNS; i++) {
70+
if (public_inputs[i].size() != AVM_PUBLIC_INPUTS_COLUMNS_MAX_LENGTH) {
71+
vinfo("Public input size mismatch");
72+
return false;
73+
}
74+
for (size_t j = 0; j < public_inputs[i].size(); j++) {
75+
transcript->add_to_hash_buffer("public_input_" + std::to_string(i) + "_" + std::to_string(j),
76+
public_inputs[i][j]);
77+
}
78+
}
6379
VerifierCommitments commitments{ key };
6480
// Get commitments to VM wires
6581
for (auto [comm, label] : zip_view(commitments.get_wires(), commitments.get_wires_labels())) {
@@ -95,11 +111,6 @@ bool AvmVerifier::verify_proof(const HonkProof& proof, const std::vector<std::ve
95111
return false;
96112
}
97113

98-
if (public_inputs.size() != AVM_NUM_PUBLIC_INPUT_COLUMNS) {
99-
vinfo("Public inputs size mismatch");
100-
return false;
101-
}
102-
103114
std::array<FF, AVM_NUM_PUBLIC_INPUT_COLUMNS> claimed_evaluations = {
104115
output.claimed_evaluations.public_inputs_cols_0_,
105116
output.claimed_evaluations.public_inputs_cols_1_,

barretenberg/cpp/src/barretenberg/vm2/constraining/verifier.test.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,10 @@ class AvmVerifierTests : public ::testing::Test {
2929
auto [trace, public_inputs] = testing::get_minimal_trace_with_pi();
3030

3131
Prover prover;
32-
const auto [proof, vk_data] = prover.prove(std::move(trace));
32+
auto public_inputs_cols = public_inputs.to_columns();
33+
const auto [proof, vk_data] = prover.prove(std::move(trace), public_inputs_cols);
3334
const auto verification_key = prover.create_verification_key(vk_data);
3435

35-
auto public_inputs_cols = public_inputs.to_columns();
3636
return { proof, verification_key, public_inputs_cols };
3737
}
3838
};

barretenberg/cpp/src/barretenberg/vm2/proving_helper.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ std::shared_ptr<AvmVerifier::VerificationKey> AvmProvingHelper::create_verificat
5555
return std::make_shared<VerificationKey>(precomputed_cmts);
5656
}
5757

58-
std::pair<AvmProvingHelper::Proof, AvmProvingHelper::VkData> AvmProvingHelper::prove(tracegen::TraceContainer&& trace)
58+
std::pair<AvmProvingHelper::Proof, AvmProvingHelper::VkData> AvmProvingHelper::prove(
59+
tracegen::TraceContainer&& trace, const std::vector<std::vector<FF>>& public_inputs_cols)
5960
{
6061
auto polynomials = AVM_TRACK_TIME_V("proving/prove:compute_polynomials", constraining::compute_polynomials(trace));
6162
auto proving_key = AVM_TRACK_TIME_V("proving/prove:proving_key", create_proving_key(polynomials));
@@ -65,7 +66,7 @@ std::pair<AvmProvingHelper::Proof, AvmProvingHelper::VkData> AvmProvingHelper::p
6566
auto prover = AVM_TRACK_TIME_V("proving/prove:construct_prover",
6667
AvmProver(proving_key, verification_key, proving_key->commitment_key));
6768

68-
auto proof = AVM_TRACK_TIME_V("proving/construct_proof", prover.construct_proof());
69+
auto proof = AVM_TRACK_TIME_V("proving/construct_proof", prover.construct_proof(public_inputs_cols));
6970
auto serialized_vk = to_buffer(verification_key->to_field_elements());
7071

7172
return { std::move(proof), std::move(serialized_vk) };

barretenberg/cpp/src/barretenberg/vm2/proving_helper.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ class AvmProvingHelper {
1515
using VkData = std::vector<uint8_t>;
1616

1717
static std::shared_ptr<AvmVerifier::VerificationKey> create_verification_key(const VkData& vk_data);
18-
std::pair<Proof, VkData> prove(tracegen::TraceContainer&& trace);
18+
std::pair<Proof, VkData> prove(tracegen::TraceContainer&& trace,
19+
const std::vector<std::vector<FF>>& public_inputs_cols);
1920
bool check_circuit(tracegen::TraceContainer&& trace);
2021
bool verify(const Proof& proof, const PublicInputs& pi, const VkData& vk_data);
2122
};

0 commit comments

Comments
 (0)