Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
logic.test.cpp
Go to the documentation of this file.
1#include <gtest/gtest.h>
2
3#include "../bool/bool.hpp"
4#include "../circuit_builders/circuit_builders.hpp"
8#include "logic.hpp"
9
10#pragma GCC diagnostic ignored "-Wunused-local-typedefs"
11
12#define STDLIB_TYPE_ALIASES \
13 using Builder = TypeParam; \
14 using witness_ct = stdlib::witness_t<Builder>; \
15 using field_ct = stdlib::field_t<Builder>; \
16 using bool_ct = stdlib::bool_t<Builder>; \
17 using public_witness_ct = stdlib::public_witness_t<Builder>;
18using namespace bb;
19
20namespace {
22}
23
24template <class T> void ignore_unused(T&) {} // use to ignore unused variables in lambdas
25
26template <class Builder> class LogicTest : public testing::Test {};
27
28using CircuitTypes = ::testing::Types<bb::UltraCircuitBuilder>;
29
31
32TYPED_TEST(LogicTest, TestCorrectLogic)
33{
35
36 auto run_test = [](size_t num_bits, Builder& builder) {
37 uint256_t mask = (uint256_t(1) << num_bits) - 1;
38
41
42 uint256_t and_expected = a & b;
43 uint256_t xor_expected = a ^ b;
44
47
48 field_ct x_const(&builder, a);
49 field_ct y_const(&builder, b);
50
51 field_ct and_result = stdlib::logic<Builder>::create_logic_constraint(x, y, num_bits, false);
52 field_ct xor_result = stdlib::logic<Builder>::create_logic_constraint(x, y, num_bits, true);
53
54 field_ct and_result_left_constant =
55 stdlib::logic<Builder>::create_logic_constraint(x_const, y, num_bits, false);
56 field_ct xor_result_left_constant = stdlib::logic<Builder>::create_logic_constraint(x_const, y, num_bits, true);
57
58 field_ct and_result_right_constant =
59 stdlib::logic<Builder>::create_logic_constraint(x, y_const, num_bits, false);
60 field_ct xor_result_right_constant =
61 stdlib::logic<Builder>::create_logic_constraint(x, y_const, num_bits, true);
62
63 field_ct and_result_both_constant =
64 stdlib::logic<Builder>::create_logic_constraint(x_const, y_const, num_bits, false);
65 field_ct xor_result_both_constant =
66 stdlib::logic<Builder>::create_logic_constraint(x_const, y_const, num_bits, true);
67
68 EXPECT_EQ(uint256_t(and_result.get_value()), and_expected);
69 EXPECT_EQ(uint256_t(and_result_left_constant.get_value()), and_expected);
70 EXPECT_EQ(uint256_t(and_result_right_constant.get_value()), and_expected);
71 EXPECT_EQ(uint256_t(and_result_both_constant.get_value()), and_expected);
72
73 EXPECT_EQ(uint256_t(xor_result.get_value()), xor_expected);
74 EXPECT_EQ(uint256_t(xor_result_left_constant.get_value()), xor_expected);
75 EXPECT_EQ(uint256_t(xor_result_right_constant.get_value()), xor_expected);
76 EXPECT_EQ(uint256_t(xor_result_both_constant.get_value()), xor_expected);
77 };
78
79 auto builder = Builder();
80 for (size_t i = 8; i < 248; i += 8) {
81 run_test(i, builder);
82 }
83 bool result = CircuitChecker::check(builder);
84 EXPECT_EQ(result, true);
85}
86
87// Tests the constraints will fail if the operands are larger than expected even though the result contains the correct
88// number of bits when using the UltraBuilder This is because the range constraints on the right and left operand
89// are not being satisfied.
90TYPED_TEST(LogicTest, LargeOperands)
91{
93
94 auto builder = Builder();
95
96 uint256_t mask = (uint256_t(1) << 48) - 1;
99
100 uint256_t expected_mask = (uint256_t(1) << 40) - 1;
101 uint256_t and_expected = (a & b) & expected_mask;
102 uint256_t xor_expected = (a ^ b) & expected_mask;
103
106
108 field_ct and_result = stdlib::logic<Builder>::create_logic_constraint(x, y, 40, false);
109 EXPECT_EQ(uint256_t(and_result.get_value()), and_expected);
110 EXPECT_EQ(uint256_t(xor_result.get_value()), xor_expected);
111
112 bool result = CircuitChecker::check(builder);
113 EXPECT_EQ(result, false);
114}
115
116// Ensures that malicious witnesses which produce the same result are detected. This potential security issue cannot
117// happen if the builder doesn't support lookup gates because constraints will be created for each bit of the left and
118// right operand.
119TYPED_TEST(LogicTest, DifferentWitnessSameResult)
120{
121
123 auto builder = Builder();
124 uint256_t a = 3758096391;
125 uint256_t b = 2147483649;
128
129 uint256_t xor_expected = a ^ b;
131 [](uint256_t left, uint256_t right, size_t chunk_size) {
132 (void)left;
133 (void)right;
134 (void)chunk_size;
135 auto left_chunk = uint256_t(2684354565);
136 auto right_chunk = uint256_t(3221225475);
137 return std::make_pair(left_chunk, right_chunk);
138 };
139
140 field_ct xor_result = stdlib::logic<Builder>::create_logic_constraint(x, y, 32, true, get_bad_chunk);
141 EXPECT_EQ(uint256_t(xor_result.get_value()), xor_expected);
142
143 bool result = CircuitChecker::check(builder);
144 EXPECT_EQ(result, false);
145}
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
virtual uint256_t get_random_uint256()=0
bb::fr get_value() const
Given a := *this, compute its value given by a.v * a.mul + a.add.
Definition field.cpp:836
static field_pt create_logic_constraint(field_pt &a, field_pt &b, size_t num_bits, bool is_xor_gate, const std::function< std::pair< uint256_t, uint256_t >(uint256_t, uint256_t, size_t)> &get_chunk=[](uint256_t left, uint256_t right, size_t chunk_size) { uint256_t left_chunk=left &((uint256_t(1)<< chunk_size) - 1);uint256_t right_chunk=right &((uint256_t(1)<< chunk_size) - 1);return std::make_pair(left_chunk, right_chunk);})
A logical AND or XOR over a variable number of bits.
Definition logic.cpp:32
AluTraceBuilder builder
Definition alu.test.cpp:124
FF a
FF b
ECCVMCircuitBuilder Builder
numeric::RNG & engine
stdlib::witness_t< Builder > witness_ct
#define STDLIB_TYPE_ALIASES
void ignore_unused(T &)
RNG & get_debug_randomness(bool reset, std::uint_fast64_t seed)
Definition engine.cpp:217
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
TYPED_TEST_SUITE(CommitmentKeyTest, Curves)
TYPED_TEST(CommitmentKeyTest, CommitToZeroPoly)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
testing::Types< bb::MegaCircuitBuilder, bb::UltraCircuitBuilder > CircuitTypes