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"
8
9#include <gtest/gtest.h>
10#include <vector>
11
12using namespace bb;
13using namespace acir_format;
14
15template <class BuilderType> class Poseidon2TestingFunctions {
16 public:
17 using Builder = BuilderType;
21
23 public:
24 enum class Target : uint8_t {
25 None,
26 Input, // Tamper with an input value
27 Output, // Tamper with an output value
28 };
29
31
32 static std::vector<std::string> get_labels() { return { "None", "Input", "Output" }; }
33 };
34
36
38 Poseidon2Constraint constraint,
39 WitnessVector witness_values,
40 const InvalidWitness::Target& invalid_witness_target)
41 {
42 switch (invalid_witness_target) {
44 // Tamper with the first input element
45 witness_values[constraint.state[0].index] += bb::fr(1);
46 break;
48 // Tamper with the first output element
49 witness_values[constraint.result[0]] += bb::fr(1);
50 break;
52 break;
53 }
54
55 return { constraint, witness_values };
56 }
57
61 static void generate_constraints(Poseidon2Constraint& poseidon2_constraint, WitnessVector& witness_values)
62 {
63 // Start with the zero variable at index 0
64 witness_values.emplace_back(bb::fr(0));
65
66 // Use a reproducible input state
67 State input_state = { bb::fr(0), bb::fr(1), bb::fr(2), bb::fr(3) };
68
69 // Compute expected output using native Poseidon2 permutation
70 State output_state = Poseidon2::permutation(input_state);
71
72 // Add input and output state to witness
73 auto input_indices = add_to_witness_and_track_indices<State, 4>(witness_values, input_state);
74 auto output_indices = add_to_witness_and_track_indices<State, 4>(witness_values, output_state);
75
76 // Create the constraint
77 poseidon2_constraint = Poseidon2Constraint{
78 .state = { WitnessOrConstant<bb::fr>::from_index(input_indices[0]),
81 WitnessOrConstant<bb::fr>::from_index(input_indices[3]) },
82 .result = { output_indices[0], output_indices[1], output_indices[2], output_indices[3] },
83 };
84 }
85};
86
87template <class Builder>
88class Poseidon2ConstraintsTest : public ::testing::Test, public TestClass<Poseidon2TestingFunctions<Builder>> {
89 protected:
91};
92
93using BuilderTypes = testing::Types<UltraCircuitBuilder, MegaCircuitBuilder>;
94
96
97TYPED_TEST(Poseidon2ConstraintsTest, GenerateVKFromConstraints)
98{
100 TestFixture::template test_vk_independence<Flavor>();
101}
102
104{
106 [[maybe_unused]] std::vector<std::string> _ = TestFixture::test_tampering();
107}
#define BB_DISABLE_ASSERTS()
Definition assert.hpp:33
static void generate_constraints(Poseidon2Constraint &poseidon2_constraint, WitnessVector &witness_values)
Generate valid Poseidon2 constraint with correct witness values.
static ProgramMetadata generate_metadata()
static std::pair< AcirConstraint, WitnessVector > invalidate_witness(Poseidon2Constraint constraint, WitnessVector witness_values, const InvalidWitness::Target &invalid_witness_target)
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
Metadata required to create a circuit.
static WitnessOrConstant from_index(uint32_t index)