Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
poseidon2_constraint.test.cpp
Go to the documentation of this file.
2#include "acir_format.hpp"
9
10#include <gtest/gtest.h>
11#include <vector>
12
13using namespace bb;
14using namespace acir_format;
15
16template <class BuilderType> class Poseidon2TestingFunctions {
17 public:
18 using Builder = BuilderType;
22
24 public:
25 enum class Target : uint8_t {
26 None,
27 Input, // Tamper with an input value
28 Output, // Tamper with an output value
29 };
30
32
33 static std::vector<std::string> get_labels() { return { "None", "Input", "Output" }; }
34 };
35
37 WitnessVector& witness_values,
38 const InvalidWitness::Target& invalid_witness_target)
39 {
40 switch (invalid_witness_target) {
42 // Tamper with the first input element
43 witness_values[constraint.state[0].index] += bb::fr(1);
44 break;
46 // Tamper with the first output element
47 witness_values[constraint.result[0]] += bb::fr(1);
48 break;
50 break;
51 }
52 }
53
57 void generate_constraints(Poseidon2Constraint& poseidon2_constraint, WitnessVector& witness_values)
58 {
59 // Start with the zero variable at index 0
60 witness_values.emplace_back(bb::fr(0));
61
62 // Use a reproducible input state
63 State input_state = { bb::fr(0), bb::fr(1), bb::fr(2), bb::fr(3) };
64
65 // Compute expected output using native Poseidon2 permutation
66 State output_state = Poseidon2::permutation(input_state);
67
68 // Add input and output state to witness
69 auto input_indices = add_to_witness_and_track_indices<State, 4>(witness_values, input_state);
70 auto output_indices = add_to_witness_and_track_indices<State, 4>(witness_values, output_state);
71
72 // Create the constraint
73 poseidon2_constraint = Poseidon2Constraint{
74 .state = { WitnessOrConstant<bb::fr>::from_index(input_indices[0]),
77 WitnessOrConstant<bb::fr>::from_index(input_indices[3]) },
78 .result = { output_indices[0], output_indices[1], output_indices[2], output_indices[3] },
79 };
80 }
81};
82
83template <class Builder>
84class Poseidon2ConstraintsTest : public ::testing::Test, public TestClass<Poseidon2TestingFunctions<Builder>> {
85 protected:
87};
88
89using BuilderTypes = testing::Types<UltraCircuitBuilder, MegaCircuitBuilder>;
90
92
93TYPED_TEST(Poseidon2ConstraintsTest, GenerateVKFromConstraints)
94{
96 TestFixture::template test_vk_independence<Flavor>();
97}
98
100{
102 [[maybe_unused]] std::vector<std::string> _ = TestFixture::test_tampering();
103}
#define BB_DISABLE_ASSERTS()
Definition assert.hpp:32
void invalidate_witness(Poseidon2Constraint &constraint, WitnessVector &witness_values, const InvalidWitness::Target &invalid_witness_target)
void generate_constraints(Poseidon2Constraint &poseidon2_constraint, WitnessVector &witness_values)
Generate valid Poseidon2 constraint with correct witness values.
Applies the Poseidon2 permutation function from https://eprint.iacr.org/2023/323.
static constexpr State permutation(const State &input)
Native form of Poseidon2 permutation from https://eprint.iacr.org/2023/323.
std::vector< bb::fr > WitnessVector
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
TYPED_TEST_SUITE(BoomerangRecursiveVerifierTest, Flavors)
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
field< Bn254FrParams > fr
Definition fr.hpp:174
TYPED_TEST(ShpleminiTest, CorrectnessOfMultivariateClaimBatching)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
::testing::Types< UltraCircuitBuilder, MegaCircuitBuilder > BuilderTypes
static std::vector< std::string > get_labels()
std::vector< WitnessOrConstant< bb::fr > > state
static WitnessOrConstant from_index(uint32_t index)