Skip to content

Commit 07bfac8

Browse files
authored
feat: merge-train/barretenberg (#19004)
BEGIN_COMMIT_OVERRIDE chore: unified stdlib/native translator and goblin verifiers (#18906) chore: Audit of range-constraints. (#18936) chore: (PCS audit) shplemini verifier output type and removing bool ptr (#18998) END_COMMIT_OVERRIDE
2 parents 39e51b4 + f365a20 commit 07bfac8

File tree

83 files changed

+1810
-1597
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

83 files changed

+1810
-1597
lines changed

barretenberg/cpp/scripts/test_chonk_standalone_vks_havent_changed.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ cd ..
1313
# - Generate a hash for versioning: sha256sum bb-chonk-inputs.tar.gz
1414
# - Upload the compressed results: aws s3 cp bb-chonk-inputs.tar.gz s3://aztec-ci-artifacts/protocol/bb-chonk-inputs-[hash(0:8)].tar.gz
1515
# Note: In case of the "Test suite failed to run ... Unexpected token 'with' " error, need to run: docker pull aztecprotocol/build:3.0
16-
pinned_short_hash="69e26033"
16+
pinned_short_hash="b70b6780"
1717
pinned_chonk_inputs_url="https://aztec-ci-artifacts.s3.us-east-2.amazonaws.com/protocol/bb-chonk-inputs-${pinned_short_hash}.tar.gz"
1818

1919
function compress_and_upload {

barretenberg/cpp/src/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,6 @@ set(BARRETENBERG_TARGET_OBJECTS
182182
$<TARGET_OBJECTS:stdlib_chonk_verifier_objects>
183183
$<TARGET_OBJECTS:stdlib_eccvm_verifier_objects>
184184
$<TARGET_OBJECTS:stdlib_honk_verifier_objects>
185-
$<TARGET_OBJECTS:stdlib_goblin_verifier_objects>
186185
$<TARGET_OBJECTS:stdlib_keccak_objects>
187186
$<TARGET_OBJECTS:stdlib_poseidon2_objects>
188187
$<TARGET_OBJECTS:stdlib_primitives_objects>
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
barretenberg_module(boomerang_value_detection stdlib_circuit_builders circuit_checker
22
stdlib_primitives numeric stdlib_aes128 stdlib_sha256 stdlib_blake2s
33
stdlib_blake3s stdlib_poseidon2 stdlib_honk_verifier
4-
stdlib_goblin_verifier goblin
4+
goblin
55
commitment_schemes)

barretenberg/cpp/src/barretenberg/boomerang_value_detection/graph_description.test.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ TEST(boomerang_ultra_circuit_constructor, test_graph_for_sort_constraints)
248248
auto b_idx = circuit_constructor.add_variable(b);
249249
auto c_idx = circuit_constructor.add_variable(c);
250250
auto d_idx = circuit_constructor.add_variable(d);
251-
circuit_constructor.create_sort_constraint({ a_idx, b_idx, c_idx, d_idx });
251+
circuit_constructor.enforce_small_deltas({ a_idx, b_idx, c_idx, d_idx });
252252

253253
fr e = fr(5);
254254
fr f = fr(6);
@@ -258,7 +258,7 @@ TEST(boomerang_ultra_circuit_constructor, test_graph_for_sort_constraints)
258258
auto f_idx = circuit_constructor.add_variable(f);
259259
auto g_idx = circuit_constructor.add_variable(g);
260260
auto h_idx = circuit_constructor.add_variable(h);
261-
circuit_constructor.create_sort_constraint({ e_idx, f_idx, g_idx, h_idx });
261+
circuit_constructor.enforce_small_deltas({ e_idx, f_idx, g_idx, h_idx });
262262

263263
StaticAnalyzer graph = StaticAnalyzer(circuit_constructor);
264264
auto connected_components = graph.find_connected_components();
@@ -477,7 +477,7 @@ TEST(boomerang_ultra_circuit_constructor, test_variables_gates_counts_for_sorted
477477
auto b_idx = circuit_constructor.add_variable(b);
478478
auto c_idx = circuit_constructor.add_variable(c);
479479
auto d_idx = circuit_constructor.add_variable(d);
480-
circuit_constructor.create_sort_constraint({ a_idx, b_idx, c_idx, d_idx });
480+
circuit_constructor.enforce_small_deltas({ a_idx, b_idx, c_idx, d_idx });
481481

482482
fr e = fr(5);
483483
fr f = fr(6);
@@ -487,7 +487,7 @@ TEST(boomerang_ultra_circuit_constructor, test_variables_gates_counts_for_sorted
487487
auto f_idx = circuit_constructor.add_variable(f);
488488
auto g_idx = circuit_constructor.add_variable(g);
489489
auto h_idx = circuit_constructor.add_variable(h);
490-
circuit_constructor.create_sort_constraint({ e_idx, f_idx, g_idx, h_idx });
490+
circuit_constructor.enforce_small_deltas({ e_idx, f_idx, g_idx, h_idx });
491491

492492
StaticAnalyzer graph = StaticAnalyzer(circuit_constructor);
493493
auto variables_gate_counts = graph.get_variables_gate_counts();
@@ -639,9 +639,9 @@ TEST(boomerang_ultra_circuit_constructor, test_graph_for_range_constraints)
639639
};
640640
auto indices = add_variables({ fr(1), fr(2), fr(3), fr(4) });
641641
for (size_t i = 0; i < indices.size(); i++) {
642-
circuit_constructor.create_new_range_constraint(indices[i], 5);
642+
circuit_constructor.create_small_range_constraint(indices[i], 5);
643643
}
644-
circuit_constructor.create_sort_constraint(indices);
644+
circuit_constructor.enforce_small_deltas(indices);
645645
StaticAnalyzer graph = StaticAnalyzer(circuit_constructor);
646646
auto connected_components = graph.find_connected_components();
647647
EXPECT_EQ(connected_components.size(), 1);
@@ -663,7 +663,7 @@ TEST(boomerang_ultra_circuit_constructor, composed_range_constraint)
663663
auto a_idx = circuit_constructor.add_variable(fr(e));
664664
circuit_constructor.create_add_gate(
665665
{ a_idx, circuit_constructor.zero_idx(), circuit_constructor.zero_idx(), 1, 0, 0, -fr(e) });
666-
circuit_constructor.decompose_into_default_range(a_idx, 134);
666+
circuit_constructor.create_limbed_range_constraint(a_idx, 134);
667667

668668
StaticAnalyzer graph = StaticAnalyzer(circuit_constructor);
669669
auto connected_components = graph.find_connected_components();

barretenberg/cpp/src/barretenberg/boomerang_value_detection/graph_description_goblin.test.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@
33
#include "barretenberg/common/test.hpp"
44

55
#include "barretenberg/goblin/goblin.hpp"
6+
#include "barretenberg/goblin/goblin_verifier.hpp"
67
#include "barretenberg/goblin/mock_circuits.hpp"
78
#include "barretenberg/srs/global_crs.hpp"
8-
#include "barretenberg/stdlib/goblin_verifier/goblin_recursive_verifier.hpp"
99
#include "barretenberg/stdlib/honk_verifier/ultra_verification_keys_comparator.hpp"
1010
#include "barretenberg/ultra_honk/ultra_prover.hpp"
1111
#include "barretenberg/ultra_honk/ultra_verifier.hpp"
1212

1313
namespace bb::stdlib::recursion::honk {
1414
class BoomerangGoblinRecursiveVerifierTests : public testing::Test {
1515
public:
16-
using Builder = GoblinRecursiveVerifier::Builder;
16+
using Builder = UltraCircuitBuilder;
1717
using ECCVMVK = Goblin::ECCVMVerificationKey;
1818
using TranslatorVK = Goblin::TranslatorVerificationKey;
1919

@@ -83,13 +83,13 @@ TEST_F(BoomerangGoblinRecursiveVerifierTests, graph_description_basic)
8383
recursive_merge_commitments.T_prev_commitments[idx].unset_free_witness_tag();
8484
}
8585

86-
GoblinRecursiveVerifier verifier{ &builder, verifier_input };
86+
auto transcript = std::make_shared<GoblinRecursiveVerifier::Transcript>();
8787
GoblinStdlibProof stdlib_proof(builder, proof);
88-
GoblinRecursiveVerifierOutput output =
89-
verifier.verify(stdlib_proof, recursive_merge_commitments, MergeSettings::APPEND);
88+
GoblinRecursiveVerifier verifier{ transcript, stdlib_proof, recursive_merge_commitments, MergeSettings::APPEND };
89+
GoblinRecursiveVerifier::ReductionResult output = verifier.reduce_to_pairing_check_and_ipa_opening();
9090

9191
stdlib::recursion::honk::DefaultIO<Builder> inputs;
92-
inputs.pairing_inputs = output.points_accumulator;
92+
inputs.pairing_inputs = output.pairing_points;
9393
inputs.set_public();
9494

9595
// Construct and verify a proof for the Goblin Recursive Verifier circuit
@@ -104,7 +104,7 @@ TEST_F(BoomerangGoblinRecursiveVerifierTests, graph_description_basic)
104104

105105
ASSERT_TRUE(verified);
106106
}
107-
auto translator_pairing_points = output.points_accumulator;
107+
auto translator_pairing_points = output.pairing_points;
108108

109109
// The pairing points are public outputs from the recursive verifier that will be verified externally via a pairing
110110
// check. While they are computed within the circuit (via batch_mul for P0 and negation for P1), their output

barretenberg/cpp/src/barretenberg/boomerang_value_detection/graph_description_merge_recursive_verifier.test.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,8 @@ template <class RecursiveBuilder> class BoomerangRecursiveMergeVerifierTest : pu
9191
auto merge_transcript = std::make_shared<StdlibTranscript<RecursiveBuilder>>();
9292
RecursiveMergeVerifier verifier{ settings, merge_transcript };
9393
const stdlib::Proof<RecursiveBuilder> stdlib_merge_proof(outer_circuit, merge_proof);
94-
[[maybe_unused]] auto [pairing_points,
95-
recursive_merged_table_commitments,
96-
degree_check_verified,
97-
concatenation_check_verified] =
98-
verifier.verify_proof(stdlib_merge_proof, recursive_merge_commitments);
94+
[[maybe_unused]] auto [pairing_points, merged_commitments, reduction_succeeded] =
95+
verifier.reduce_to_pairing_check(stdlib_merge_proof, recursive_merge_commitments);
9996

10097
// Check for a failure flag in the recursive verifier circuit
10198
EXPECT_FALSE(outer_circuit.failed());

barretenberg/cpp/src/barretenberg/boomerang_value_detection/variable_gates_count.test.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ TEST(boomerang_ultra_circuit_constructor, test_variable_gates_count_for_decompos
2121
auto a_idx = circuit_constructor.add_variable(fr(e));
2222
circuit_constructor.create_add_gate(
2323
{ a_idx, circuit_constructor.zero_idx(), circuit_constructor.zero_idx(), 1, 0, 0, -fr(e) });
24-
circuit_constructor.decompose_into_default_range(a_idx, 134);
24+
circuit_constructor.create_limbed_range_constraint(a_idx, 134);
2525

2626
StaticAnalyzer graph = StaticAnalyzer(circuit_constructor);
2727
std::unordered_set<uint32_t> variables_in_on_gate = graph.get_variables_in_one_gate();
@@ -37,7 +37,7 @@ TEST(boomerang_ultra_circuit_constructor, test_variable_gates_count_for_decompos
3737
auto a_idx = circuit_constructor.add_variable(fr(e));
3838
circuit_constructor.create_add_gate(
3939
{ a_idx, circuit_constructor.zero_idx(), circuit_constructor.zero_idx(), 1, 0, 0, -fr(e) });
40-
circuit_constructor.decompose_into_default_range(a_idx, 42);
40+
circuit_constructor.create_limbed_range_constraint(a_idx, 42);
4141

4242
StaticAnalyzer graph = StaticAnalyzer(circuit_constructor);
4343
auto variables_in_on_gate = graph.get_variables_in_one_gate();
@@ -81,8 +81,8 @@ TEST(boomerang_ultra_circuit_constructor, test_variable_gates_count_for_two_deco
8181
{ a1_idx, circuit_constructor.zero_idx(), circuit_constructor.zero_idx(), 1, 0, 0, -fr(e1) });
8282
circuit_constructor.create_add_gate(
8383
{ a2_idx, circuit_constructor.zero_idx(), circuit_constructor.zero_idx(), 1, 0, 0, -fr(e2) });
84-
circuit_constructor.decompose_into_default_range(a1_idx, 42);
85-
circuit_constructor.decompose_into_default_range(a2_idx, 42);
84+
circuit_constructor.create_limbed_range_constraint(a1_idx, 42);
85+
circuit_constructor.create_limbed_range_constraint(a2_idx, 42);
8686

8787
StaticAnalyzer graph = StaticAnalyzer(circuit_constructor);
8888
std::unordered_set<uint32_t> variables_in_one_gate = graph.get_variables_in_one_gate();
@@ -100,8 +100,8 @@ TEST(boomerang_ultra_circuit_constructor, test_decompose_with_boolean_gates)
100100
auto e2 = fr(d2);
101101
auto a1_idx = circuit_constructor.add_variable(fr(e1));
102102
auto a2_idx = circuit_constructor.add_variable(fr(e2));
103-
circuit_constructor.decompose_into_default_range(a1_idx, 42);
104-
circuit_constructor.decompose_into_default_range(a2_idx, 42);
103+
circuit_constructor.create_limbed_range_constraint(a1_idx, 42);
104+
circuit_constructor.create_limbed_range_constraint(a2_idx, 42);
105105

106106
for (size_t i = 0; i < 20; ++i) {
107107
fr a = fr::zero();
@@ -123,7 +123,7 @@ TEST(boomerang_ultra_circuit_constructor, test_decompose_for_6_bit_number)
123123
auto a_idx = circuit_constructor.add_variable(fr(d));
124124
circuit_constructor.create_add_gate(
125125
{ a_idx, circuit_constructor.zero_idx(), circuit_constructor.zero_idx(), 1, 0, 0, -fr(e) });
126-
circuit_constructor.decompose_into_default_range(a_idx, 6);
126+
circuit_constructor.create_limbed_range_constraint(a_idx, 6);
127127

128128
StaticAnalyzer graph = StaticAnalyzer(circuit_constructor);
129129
std::unordered_set<uint32_t> variables_in_on_gate = graph.get_variables_in_one_gate();

barretenberg/cpp/src/barretenberg/chonk/chonk.cpp

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "barretenberg/common/bb_bench.hpp"
99
#include "barretenberg/common/streams.hpp"
1010
#include "barretenberg/ecc/curves/grumpkin/grumpkin.hpp"
11+
#include "barretenberg/goblin/goblin_verifier.hpp"
1112
#include "barretenberg/honk/prover_instance_inspector.hpp"
1213
#include "barretenberg/multilinear_batching/multilinear_batching_prover.hpp"
1314
#include "barretenberg/serialize/msgpack_impl.hpp"
@@ -530,24 +531,51 @@ bool Chonk::verify(const Proof& proof, const VerificationKey& vk)
530531
using TableCommitments = Goblin::TableCommitments;
531532
// Create a transcript to be shared by MegaZK-, Merge-, ECCVM-, and Translator- Verifiers.
532533
std::shared_ptr<Goblin::Transcript> chonk_verifier_transcript = std::make_shared<Goblin::Transcript>();
533-
// Verify the Hiding kernel proof
534+
535+
// Step 1: Verify the Hiding kernel proof
534536
MegaZKVerifier verifier{ vk.mega, /*ipa_verification_key=*/{}, chonk_verifier_transcript };
535537
auto [mega_verified, kernel_return_data, T_prev_commitments] =
536538
verifier.template verify_proof<bb::HidingKernelIO>(proof.mega_proof);
537539
vinfo("Mega verified: ", mega_verified);
538-
// Perform databus consistency checks
540+
if (!mega_verified) {
541+
info("Chonk verification failed at Mega step");
542+
return false;
543+
}
544+
545+
// Step 2: Perform databus consistency checks
539546
bool databus_consistency_verified = kernel_return_data == verifier.verifier_instance->witness_commitments.calldata;
540547
vinfo("Databus consistency verified: ", databus_consistency_verified);
548+
if (!databus_consistency_verified) {
549+
info("Chonk verification failed at databus consistency check");
550+
return false;
551+
}
552+
541553
// Extract the commitments to the subtable corresponding to the incoming circuit
542554
TableCommitments t_commitments = verifier.verifier_instance->witness_commitments.get_ecc_op_wires().get_copy();
543555

544-
// Goblin verification (final merge, eccvm, translator)
545-
bool goblin_verified = Goblin::verify(
546-
proof.goblin_proof, { t_commitments, T_prev_commitments }, chonk_verifier_transcript, MergeSettings::APPEND);
547-
vinfo("Goblin verified: ", goblin_verified);
556+
// Step 3: Goblin verification (merge, eccvm, translator)
557+
// Reduces Goblin proof to pairing points and IPA claim. In native mode, pairing checks are performed
558+
// immediately for fail-fast. goblin_checks_passed includes reduction checks + pairing checks (pairing performed).
559+
GoblinVerifier goblin_verifier{
560+
chonk_verifier_transcript, proof.goblin_proof, { t_commitments, T_prev_commitments }, MergeSettings::APPEND
561+
};
562+
auto [_, ipa_claim, ipa_proof, goblin_checks_passed] = goblin_verifier.reduce_to_pairing_check_and_ipa_opening();
563+
if (!goblin_checks_passed) {
564+
info("Chonk verification failed at Goblin checks (merge/eccvm/translator reduction + pairing)");
565+
return false;
566+
}
567+
568+
// Step 4: Verify IPA opening
569+
auto ipa_transcript = std::make_shared<Goblin::Transcript>(ipa_proof);
570+
auto ipa_vk = VerifierCommitmentKey<curve::Grumpkin>{ ECCVMFlavor::ECCVM_FIXED_SIZE };
571+
bool ipa_verified = IPA<curve::Grumpkin>::reduce_verify(ipa_vk, ipa_claim, ipa_transcript);
572+
vinfo("Goblin IPA verified: ", ipa_verified);
573+
if (!ipa_verified) {
574+
info("Chonk verification failed at IPA check");
575+
return false;
576+
}
548577

549-
// TODO(https://github.com/AztecProtocol/barretenberg/issues/1396): State tracking in Chonk verifiers.
550-
return goblin_verified && mega_verified && databus_consistency_verified;
578+
return true;
551579
}
552580

553581
// Proof methods

barretenberg/cpp/src/barretenberg/chonk/chonk.test.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ TEST_F(ChonkTests, WrongProofComponentFailure)
227227

228228
tampered_proof.goblin_proof.merge_proof = chonk_proof_2.goblin_proof.merge_proof;
229229

230-
EXPECT_THROW_WITH_MESSAGE(Chonk::verify(tampered_proof, chonk_vk_1), "IPA verification fails");
230+
EXPECT_FALSE(Chonk::verify(tampered_proof, chonk_vk_1));
231231
}
232232

233233
{
@@ -236,7 +236,7 @@ TEST_F(ChonkTests, WrongProofComponentFailure)
236236

237237
tampered_proof.mega_proof = chonk_proof_2.mega_proof;
238238

239-
EXPECT_THROW_WITH_MESSAGE(Chonk::verify(tampered_proof, chonk_vk_1), "IPA verification fails");
239+
EXPECT_FALSE(Chonk::verify(tampered_proof, chonk_vk_1));
240240
}
241241

242242
{
@@ -245,7 +245,7 @@ TEST_F(ChonkTests, WrongProofComponentFailure)
245245

246246
tampered_proof.goblin_proof.eccvm_proof = chonk_proof_2.goblin_proof.eccvm_proof;
247247

248-
EXPECT_THROW_WITH_MESSAGE(Chonk::verify(tampered_proof, chonk_vk_1), "IPA verification fails");
248+
EXPECT_FALSE(Chonk::verify(tampered_proof, chonk_vk_1));
249249
}
250250

251251
{

barretenberg/cpp/src/barretenberg/circuit_checker/ultra_circuit_builder_basic.test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ TEST(UltraCircuitBuilder, CheckCircuitShowcase)
7979
EXPECT_TRUE(CircuitChecker::check(builder));
8080

8181
// Now let's create a range constraint for b
82-
builder.create_new_range_constraint(b, 0xbeef);
82+
builder.create_small_range_constraint(b, 0xbeef);
8383

8484
// We can check if this works
8585
EXPECT_TRUE(CircuitChecker::check(builder));

0 commit comments

Comments
 (0)