Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
ultra_circuit_builder_basic.test.cpp
Go to the documentation of this file.
3
4#include <gtest/gtest.h>
5
6using namespace bb;
7
8namespace bb {
9
10TEST(UltraCircuitBuilder, CopyConstructor)
11{
13
14 for (size_t i = 0; i < 16; ++i) {
15 for (size_t j = 0; j < 16; ++j) {
16 uint64_t left = static_cast<uint64_t>(j);
17 uint64_t right = static_cast<uint64_t>(i);
18 uint32_t left_idx = builder.add_variable(fr(left));
19 uint32_t right_idx = builder.add_variable(fr(right));
20 uint32_t result_idx = builder.add_variable(fr(left ^ right));
21
22 uint32_t add_idx = builder.add_variable(fr(left) + fr(right) + builder.get_variable(result_idx));
23 builder.create_big_add_gate(
24 { left_idx, right_idx, result_idx, add_idx, fr(1), fr(1), fr(1), fr(-1), fr(0) });
25 }
26 }
27
28 EXPECT_TRUE(CircuitChecker::check(builder));
29
30 UltraCircuitBuilder duplicate_builder{ builder };
31
32 EXPECT_EQ(duplicate_builder.get_num_finalized_gates_inefficient(), builder.get_num_finalized_gates_inefficient());
33 EXPECT_TRUE(CircuitChecker::check(duplicate_builder));
34}
35
37{
39 fr a = fr::one();
40 builder.add_public_variable(a);
41 EXPECT_TRUE(CircuitChecker::check(builder));
42}
43
44TEST(UltraCircuitBuilder, TestNoLookupProof)
45{
47
48 for (size_t i = 0; i < 16; ++i) {
49 for (size_t j = 0; j < 16; ++j) {
50 uint64_t left = static_cast<uint64_t>(j);
51 uint64_t right = static_cast<uint64_t>(i);
52 uint32_t left_idx = builder.add_variable(fr(left));
53 uint32_t right_idx = builder.add_variable(fr(right));
54 uint32_t result_idx = builder.add_variable(fr(left ^ right));
55
56 uint32_t add_idx = builder.add_variable(fr(left) + fr(right) + builder.get_variable(result_idx));
57 builder.create_big_add_gate(
58 { left_idx, right_idx, result_idx, add_idx, fr(1), fr(1), fr(1), fr(-1), fr(0) });
59 }
60 }
61
62 EXPECT_TRUE(CircuitChecker::check(builder));
63}
64
65TEST(UltraCircuitBuilder, CheckCircuitShowcase)
66{
68 // check_circuit allows us to check correctness on the go
69
70 uint32_t a = builder.add_variable(fr(0xdead));
71 uint32_t b = builder.add_variable(fr(0xbeef));
72 // Let's create 2 gates that will bind these 2 variables to be one these two values
73 builder.create_arithmetic_gate(
74 { a, a, builder.zero_idx(), fr(1), -fr(0xdead) - fr(0xbeef), 0, 0, fr(0xdead) * fr(0xbeef) });
75 builder.create_arithmetic_gate(
76 { b, b, builder.zero_idx(), fr(1), -fr(0xdead) - fr(0xbeef), 0, 0, fr(0xdead) * fr(0xbeef) });
77
78 // We can check if this works
79 EXPECT_TRUE(CircuitChecker::check(builder));
80
81 // Now let's create a range constraint for b
82 builder.create_new_range_constraint(b, 0xbeef);
83
84 // We can check if this works
85 EXPECT_TRUE(CircuitChecker::check(builder));
86
87 // But what if we now assert b to be equal to a?
88 builder.assert_equal(a, b, "Oh no");
89
90 // It fails, because a is 0xdead and it can't fit in the range constraint
91 EXPECT_FALSE(CircuitChecker::check(builder));
92
93 // But if we force them both back to be 0xbeef...
94 uint32_t c = builder.add_variable(fr(0xbeef));
95 builder.assert_equal(c, b);
96
97 // The circuit will magically pass again
98 EXPECT_TRUE(CircuitChecker::check(builder));
99}
100
101} // namespace bb
virtual uint32_t add_variable(const FF &in)
Add a variable to variables.
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
AluTraceBuilder builder
Definition alu.test.cpp:124
FF a
FF b
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
field< Bn254FrParams > fr
Definition fr.hpp:174
TEST(BoomerangMegaCircuitBuilder, BasicCircuit)
static constexpr field one()